簡體   English   中英

在 Array.sort() 中實現 Java 比較器

[英]Implement Java Comparator in Array.sort()

假設我有一個二維 arrays 數組,它們代表我要比較的點。 例如,我可以比較與原點的距離。 我能做的是創建一個 class Point

class Point implements Comparable<Point>{
     // class variables, constructor
     public int compareTo(Point p) {
         return (x*x + y*y).compareTo(p.x*p.x + p.y*p.y);
     }
}

並用所有點填充一個Point類型的數組,然后使用Array.sort(pointsArray) 這也可以通過以下方式完成:

1) Arrays.sort(points, Comparator.comparing(p -> p[0]*p[0] + p[1]*p[1]));

或者

2) Arrays.sort(points, (p1, p2) -> p1[0]*p1[0] + p1[1]*p1[1] - p2[0]*p2[0] - p2[1]*p2[1]);

無需創建任何新的數據類型。 可以在 這個問題中找到解釋。

現在,如果我需要先比較 x 坐標,如果比較沒有差異,則需要 y 坐標,即:

class Point implements Comparable<Point>{
     // class variables, constructor
     public int compareTo(Point p) {
         int cmp = x.compareTo(p.x);
         if(cmp == 0) return y.compareTo(p.y);
         return cmp;
     }
}

這如何翻譯成1)2)

使用盡可能最短的方式,例如Comparator.comparing(Point::getX).thenComparing(Point::getY)

沒有理由使用更長的版本。 它們的可讀性較差,而且很容易出錯。 例如,這是一種可能的實現

(p1, p2) -> {
    if(p1.x == p2.x) {
        return p1.y.compareTo(p2.y);
    }
    return p1.x.compareTo(p2.x);
}

需要更長的時間才能理解那里發生的事情,不是嗎?

只需使用括號為 lambda function 做一個更大的命名空間來比較

Arrays.sort(points, (p1, p2) -> {
    int x1 = p1[0];
    int x2 = p2[0];
    int y1 = p1[1];
    int y2 = p2[1];
     // just for readability no need to make local variables
    if(x1 == x2){
      // compare y1 and y2 values here return 1 for greater 0 for equal -1 for less then
    }else{
    // x compare

    }



});

暫無
暫無

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

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