无法在Java中使用自定义Comparator

时间:2016-04-16 15:46:30

标签: java comparator comparable

我在为我的班级实现自定义比较器时遇到问题:

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对汽车进行排序。 我无法找到我的错误,所以请帮助我。

3 个答案:

答案 0 :(得分:2)

  1. 您必须在public int compareTo(Car o)课程中实施Car来编译您的计划。

  2. Collections.sort(cars, new Car().new CustomOrder());,因为CustomOrder是内部类,而不是静态嵌套类。它可以由对外部类的现有引用创建。

  3. 内部类的实例只能存在于外部类的实例中,并且可以直接访问其封闭实例的方法和字段。

    您似乎完全不了解内部类和嵌套类。我建议在Oracle Tutorials上阅读them

答案 1 :(得分:1)

正如Andrew Tobilko建议的那样,你必须在Car类中实现compareTo方法,因为你想比较Car对象。

查看链接Java Object Sorting

另外请写清洁代码。您的代码很难阅读,即使它很短。

答案 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类