猿问

如何使用Java中的比较器进行排序

如何使用Java中的比较器进行排序

我学会了如何使用比较器,但我在使用比较器时遇到了困难。我的代码中有一个错误:

Exception in thread "main" java.lang.ClassCastException: New.People cannot be cast to java.lang.Comparable
 at java.util.Arrays.mergeSort(Unknown Source)
 at java.util.Arrays.sort(Unknown Source)
 at java.util.Collections.sort(Unknown Source)
 at New.TestPeople.main(TestPeople.java:18)

这是我的代码:

import java.util.Comparator;public class People implements Comparator {
   private int id;
   private String info;
   private double price;

   public People(int newid, String newinfo, double newprice) {
       setid(newid);
       setinfo(newinfo);
       setprice(newprice);
   }

   public int getid() {
       return id;
   }

   public void setid(int id) {
       this.id = id;
   }

   public String getinfo() {
       return info;
   }

   public void setinfo(String info) {
       this.info = info;
   }

   public double getprice() {
       return price;
   }

   public void setprice(double price) {
       this.price = price;
   }

   public int compare(Object obj1, Object obj2) {
       Integer p1 = ((People) obj1).getid();
       Integer p2 = ((People) obj2).getid();

       if (p1 > p2) {
           return 1;
       } else if (p1 < p2){
           return -1;
       } else {
           return 0;
       }
    }}
import java.util.ArrayList;import java.util.Collections;public class TestPeople {
    public static void main(String[] args) {
        ArrayList peps = new ArrayList();

        peps.add(new People(123, "M", 14.25));
        peps.add(new People(234, "M", 6.21));
        peps.add(new People(362, "F", 9.23));
        peps.add(new People(111, "M", 65.99));
        peps.add(new People(535, "F", 9.23));

        Collections.sort(peps);

        for (int i = 0; i < peps.size(); i++){
            System.out.println(peps.get(i));
        }
    }}

我相信它必须在比较法中对铸件做些什么,但我只是在玩弄它,仍然找不到解决的办法。


FFIVE
浏览 879回答 3
3回答

蛊毒传说

下面是一个非常短的模板,可以立即进行排序:Collections.sort(people,new&nbsp;Comparator<Person>(){ &nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;compare(final&nbsp;Person&nbsp;lhs,Person&nbsp;rhs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TODO&nbsp;return&nbsp;1&nbsp;if&nbsp;rhs&nbsp;should&nbsp;be&nbsp;before&nbsp;lhs&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1&nbsp;if&nbsp;lhs&nbsp;should&nbsp;be&nbsp;before&nbsp;rhs &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0&nbsp;otherwise&nbsp;(meaning&nbsp;the&nbsp;order&nbsp;stays&nbsp;the&nbsp;same) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;});如果很难记住,试着记住(就数字的符号而言)它与:&nbsp;lhs-rhs这是为了防止你想按升序排序:从最小的数字到最大的数字。

倚天杖

使用People implements Comparable<People>相反,这定义了People.A&nbsp;Comparator<People>也可以另外定义,但是People implements Comparator<People>不是正确的做事方式。两个过载Collections.sort是不同的:<T extends Comparable<? super T>> void sort(List<T> list)分类Comparable使用其自然顺序的对象<T> void sort(List<T> list, Comparator<? super T> c)排序任何使用兼容Comparator你把这两个人搞混了Comparator(这也是为什么没有意义的原因Person implements Comparator<Person>)。再一次,用Collections.sort,你需要其中之一是真的:类型必须是Comparable(使用1-Argsort)A&nbsp;Comparator必须提供类型(使用2-args)。sort)相关问题何时使用可比与比较器整理联系人列表还有,不要在新代码中使用原始类型。..原始类型是不安全的,只为兼容性而提供。也就是说,不是这样:ArrayList&nbsp;peps&nbsp;=&nbsp;new&nbsp;ArrayList();&nbsp;//&nbsp;BAD!!!&nbsp;No&nbsp;generic&nbsp;safety!您应该使用type esafe泛型声明,如下所示:List<People>&nbsp;peps&nbsp;=&nbsp;new&nbsp;ArrayList<People>();&nbsp;//&nbsp;GOOD!!!然后你会发现你的代码甚至都不编译!这将是一件好事,因为代码有问题(Person不implements Comparable<Person>),&nbsp;但是由于您使用了原始类型,编译器没有检查此类型,而你却得到了一个ClassCastException在跑的时候!这应该会说服您始终在新代码中使用类型-afe泛型类型。一直都是。另见什么是原始类型,我们为什么不使用它?
随时随地看视频慕课网APP

相关分类

Java
我要回答