簡體   English   中英

無法在Java中使用自定義比較器

[英]Can't use custom Comparator in Java

我在為類實現自定義比較器時遇到問題:

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對汽車進行排序。 我找不到我的錯誤,請幫助我。

  1. 您必須在Car類中實現public int compareTo(Car o)才能編譯程序。

  2. Collections.sort(cars, new Car().new CustomOrder()); ,因為CustomOrder是一個內部類,而不是靜態的嵌套類。 它可以通過對外部類的現有引用來創建。

內部類的實例只能存在於外部類的實例中,並且可以直接訪問其封閉實例的方法和字段。


看來您不完全了解內部和嵌套類。 我建議在Oracle教程中閱讀有關它們的內容。

如Andrew Tobilko所建議,您必須在Car類中實現compareTo方法,因為您想比較Car對象。

看一下鏈接Java Object Sorting

也請寫干凈的代碼。 即使代碼很短,也很難閱讀。

嘗試擺脫static關鍵字,這不是一個好方法,並且很容易以不良的設計模式出現。

您擁有Car類,並在某處列出了這些類,因此無論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類的新比較器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM