当前位置: 首页 > 面试题库 >

如何在Java中使用Comparator进行排序

阎京
2023-03-14
问题内容

我学会了如何使用可比对象,但是在使用比较器时遇到了困难。我的代码有错误:

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));
        }
    }
}

我相信它必须与比较方法中的转换有关,但我一直在玩,但仍然找不到解决方案


问题答案:

你的示例类有几件尴尬的事情:

  • 它有个price和时称为人info(更多用于对象,而不是人);
  • 当将一个类命名为某个事物的复数形式时,这表明它是对多个事物的抽象

无论如何,这是如何使用的演示Comparator<T>

public class ComparatorDemo {

    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Joe", 24),
                new Person("Pete", 18),
                new Person("Chris", 21)
        );
        Collections.sort(people, new LexicographicComparator());
        System.out.println(people);
        Collections.sort(people, new AgeComparator());
        System.out.println(people);
    }
}

class LexicographicComparator implements Comparator<Person> {
    @Override
    public int compare(Person a, Person b) {
        return a.name.compareToIgnoreCase(b.name);
    }
}

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person a, Person b) {
        return a.age < b.age ? -1 : a.age == b.age ? 0 : 1;
    }
}

class Person {

    String name;
    int age;

    Person(String n, int a) {
        name = n;
        age = a;
    }

    @Override
    public String toString() {
        return String.format("{name=%s, age=%d}", name, age);
    }
}

编辑
等效的Java 8演示如下所示:

public class ComparatorDemo {

    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Joe", 24),
                new Person("Pete", 18),
                new Person("Chris", 21)
        );
        Collections.sort(people, (a, b) -> a.name.compareToIgnoreCase(b.name));
        System.out.println(people);
        Collections.sort(people, (a, b) -> a.age < b.age ? -1 : a.age == b.age ? 0 : 1);
        System.out.println(people);
    }
}


 类似资料:
  • 我使用Java Comparator按照单词频率属性的降序对单词对象的ArrayList进行排序。Word对象是通过首先使用hashmap从数据库中读取单词来创建的。txt文件,然后将hashmap转换为Word对象的ArrayList。然后我想按字母顺序对频率相同的单词进行排序。

  • 我不知道如何正确使用比较器接口。 注意:我不想使用我在大多数代码中看到的“一行”比较器实现,这意味着: 再说一遍,我不想使用这个,因为我将对许多不同的ArrayList进行排序,每次这样做似乎都是浪费空间。我想以某种方式让它工作,让我的compareTo方法在一个地方编写一次。 我尝试了许多不同的方法,但我对实现接口还不熟悉,所以我可能遗漏了一些东西。 这是我的Card类和它的比较方法。(注意:让

  • 我正在初始化一个优先级队列,如下所示: 我的比较器类的代码是: 运行模拟后,元素根本没有排序——它们是随机的;我在我的FuelPriority类的compare方法中设置了一个断点,但它根本没有被调用。我错过什么了吗?

  • 问题内容: 在Python中,我试图按日期与lambda排序。我无法理解我的错误消息。消息是: 我的电话是 问题答案: 采用 在Python 2.x上,该函数按以下顺序使用其参数: 因此,如果没有,您传入的函数将被视为带有2个参数的函数。

  • TreeSet和TreeMap都按排序顺序存储元素。 但是,比较器精确定义了sorted order含义。 Comparator接口定义了两个方法:compare()和equals()。 这里显示的compare()方法比较了两个元素 - 比较方法 int compare(Object obj1, Object obj2) obj1和obj2是要比较的对象。 如果对象相等,则此方法返回零。 如果

  • 问题内容: 我有一堂水果课。我正在创建此类的列表,并将每个水果添加到列表中。我想根据水果名称的顺序对该列表进行排序。 我正在使用for循环创建它的列表 我需要使用列表中每个对象的水果名称对该arrayList进行排序 问题答案: 使用这样的: 现在,你的水果清单将基于进行排序。