首页 > 解决方案 > 如何编写比较多个参数的比较器?

问题描述

我正在尝试编写一个比较器来比较坐标类的两个对象。Coordinate 类非常简单:

public class Coordinate {

    private int x, y;

    public Coordinate(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

}

现在我希望比较器比较坐标类的两个实例的 x 和 y 值。这是一个例子:
我有一个坐标 c1,它有 x = 42 和 y = 23。我的第二个坐标 c2 有 x = 23 和 y = 54。现在我把它们都放在一个 ArrayList 中,并且想要对列表进行排序。我想按如下方式排序:
具有最低 y 值的坐标始终排在第一位,当您有两个具有相同 y 值的坐标时,坐标排在第一位,它的 x 值较低。
例子:

c1 (y = 4, x = 5 ) < c2 (y = 4, x = 6) < c3 (y = 5, x = 2)  

那么我该如何为此目的编写比较器呢?
非常感谢!

标签: javacomparisoncomparator

解决方案


Comparator<Coordinate> c = Comparator.comparingInt(Coordinate::getY)
                                     .thenComparingInt(Coordinate::getX);

您可以通过thenComparing和构建复合比较器thenComparingX

var list = List.of(
        new Coordinate(6, 4),
        new Coordinate(2, 5),
        new Coordinate(5, 4)
);

list.sort(c);
System.out.println(list);

片段打印

[{y=4, x=5}, {y=4, x=6}, {y=5, x=2}]

推荐阅读