为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2019-06-19 17:30:49
如何使用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));         }     }}我相信它必须在比较法中对铸件做些什么,但我只是在玩弄它,仍然找不到解决的办法。
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

下面是一个非常短的模板,可以立即进行排序:

Collections.sort(people,new Comparator<Person>(){
   @Override
   public int compare(final Person lhs,Person rhs) {
     //TODO return 1 if rhs should be before lhs 
     //     return -1 if lhs should be before rhs
     //     return 0 otherwise (meaning the order stays the same)
     }
 });

如果很难记住,试着记住(就数字的符号而言)它与:

 lhs-rhs

这是为了防止你想按升序排序:从最小的数字到最大的数字。


查看完整回答
反对 回复 2019-06-19
?
倚天杖

TA贡献1828条经验 获得超3个赞

使用People implements Comparable<People>相反,这定义了People.

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-Arg

    sort)

  • Comparator

    必须提供类型(使用2-args)。

    sort)

相关问题


还有,不要在新代码中使用原始类型。..原始类型是不安全的,只为兼容性而提供。

也就是说,不是这样:

ArrayList peps = new ArrayList(); // BAD!!! No generic safety!

您应该使用type esafe泛型声明,如下所示:

List<People> peps = new ArrayList<People>(); // GOOD!!!

然后你会发现你的代码甚至都不编译!这将是一件好事,因为代码有问题(Personimplements Comparable<Person>), 但是由于您使用了原始类型,编译器没有检查此类型,而你却得到了一个ClassCastException在跑的时候!

这应该会说服您始终在新代码中使用类型-afe泛型类型。一直都是。

另见


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 878 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信