在Array.sort()中实现Java比较器

在Array.sort()中实现Java比较器,java,sorting,compare,comparison,Java,Sorting,Compare,Comparison,假设我有一个二维数组,表示我想要比较的点。例如,我可以比较与原点的距离。我可以做的是创建一个类点: 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); } } 或 不创建任何新的数

假设我有一个二维数组,表示我想要比较的点。例如,我可以比较与原点的距离。我可以做的是创建一个类

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

不创建任何新的数据类型。 这种解释是有疑问的

现在,如果我需要先比较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;
     }
}
类点实现可比较{
//类变量,构造函数
公共国际比较(p点){
int cmp=x.compareTo(p.x);
如果(cmp==0),则返回y.compareTo(p.y);
返回cmp;
}
}

如何将其转换为1)2)

使用尽可能短的方法,例如
比较器。比较(Point::getX)。然后比较(Point::getY)

没有理由使用更长的版本。它们可读性较差,而且很容易出错。例如,这里有一个可能的实现

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

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

只需使用括号为lambda函数留出更大的名称空间进行比较

数组。排序(点,(p1,p2)->{
int x1=p1[0];
int x2=p2[0];
int y1=p1[1];
int y2=p2[1];
//只是为了可读性,不需要生成局部变量
如果(x1==x2){
//比较此处的y1和y2值返回1表示大于0表示等于-1表示小于
}否则{
//x比较
}
});
比较器。比较int(p->p.x)。然后比较int(p->p.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;
     }
}
(p1, p2) -> {
    if(p1.x == p2.x) {
        return p1.y.compareTo(p2.y);
    }
    return p1.x.compareTo(p2.x);
}