我在为我的班级实现自定义比较器时遇到问题:
public class MyProject {
private static class SuperClass {
public SuperClass (ArrayList<Car> cars) {
Collections.sort(cars);
Collections.sort(cars, new Car.CustomOrder());
}
}
public final static class Car implements Comparable<Car> {
public Comparator<Car> customOrder() {
return new CustomOrder();
}
public class CustomOrder implements Comparator<Car> {
public int compare(Car c1, Car c2) {
// some code
return 1;
}
}
}
我想通过自定义比较器CustomOrder
对汽车进行排序。
我无法找到我的错误,所以请帮助我。
答案 0 :(得分:2)
您必须在public int compareTo(Car o)
课程中实施Car
来编译您的计划。
Collections.sort(cars, new Car().new CustomOrder());
,因为CustomOrder
是内部类,而不是静态嵌套类。它可以由对外部类的现有引用创建。
内部类的实例只能存在于外部类的实例中,并且可以直接访问其封闭实例的方法和字段。
您似乎完全不了解内部类和嵌套类。我建议在Oracle Tutorials上阅读them。
答案 1 :(得分:1)
正如Andrew Tobilko建议的那样,你必须在Car类中实现compareTo方法,因为你想比较Car对象。
另外请写清洁代码。您的代码很难阅读,即使它很短。
答案 2 :(得分:1)
尝试摆脱静态关键字,这不是一个好方法,可以很容易地在一个糟糕的设计模式中。
你有Car类,以及某些地方的列表,所以无论汽车是否实现可比较,你都可以使用匿名的并使用排序标准所需的字段......
按 OrderId (只是字符串)
对列表进行排序public static void main(String[] args) {
List<Car> myCars = new ArrayList<>();
myCars.add(new Car(0, "qqweqw", "qwe"));
myCars.add(new Car(1, "Aqqweqw", "qwe"));
myCars.add(new Car(2, "Zqqweqw", "qwe"));
System.out.println("unsorted list" + myCars);
Collections.sort(myCars, new Comparator<Car>() {
@Override
public int compare(Car o1, Car o2) {
return o1.getOrder().compareTo(o2.getOrder());
}
});
System.out.println("sorted list" + myCars);
}
然后你可以看到,不需要声明一个新的比较器类,它将依赖项绑定到Car类