【问题标题】:Implement Java Comparator in Array.sort()在 Array.sort() 中实现 Java 比较器
【发布时间】:2019-09-26 13:22:33
【问题描述】:

假设我有一个二维数组,代表我想要比较的点。例如,我可以比较与原点的距离。我能做的是创建一个类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]);

不创建任何新的数据类型。 解释可以在this问题中找到。

现在,如果我需要先比较 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.&lt;Point&gt;comparingInt(p -&gt; p.x).thenComparingInt(p -&gt; p.y)。 (或comparingDouble,或其他)。

标签: java sorting compare comparison


【解决方案1】:

尽可能使用最短的方式,例如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);
}

了解那里发生的事情需要更长的时间,不是吗?

【讨论】:

    【解决方案2】:

    只需使用括号为 lambda 函数创建更大的名称空间来比较

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多