如何编写比较多个参数的比较器?

时间:2018-10-14 12:22:10

标签: java comparison comparator

我正在尝试编写一个Comparator,用于比较Coordinate类的两个对象。 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;
    }

}

现在,我希望比较器比较类Coordinate的两个实例的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)  

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

2 个答案:

答案 0 :(得分:2)

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

您可以通过thenComparingthenComparingX构建复合比较器。

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}]

答案 1 :(得分:1)

  • 使用比较器


import java.util.ArrayList;
import java.util.Comparator;

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

    public String toString() {
        return "x = " + x + " y = " + y;
    }
}

public class Temp {
    public static void main(String[] args) {
        ArrayList<Coordinate> A = new ArrayList<>();
        A.add(new Coordinate(1, 2));
        A.add(new Coordinate(2, 1));
        A.add(new Coordinate(3, 2));
        A.sort(new Comparator<Coordinate>() {

            @Override
            public int compare(Coordinate o1, Coordinate o2) {
                if (o1.getY() < o2.getY()) {
                    return -1;
                } else if (o1.getY() > o2.getY()) {
                    return 1;
                } else {
                    if (o1.getX() < o2.getX()) {
                        return -1;
                    } else if (o1.getX() > o2.getX()) {
                        return 1;
                    }
                    return 0;
                }
            }
        });
        System.out.println(A.toString());
    }
}
  • 使用可比接口


import java.util.ArrayList;

class Coordinate implements Comparable<Coordinate> { # Notice implementing Comparable interface
    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;
    }

    @Override
    public int compareTo(Coordinate o) { # implementing the abstract method of Comparable interface
        if (y < o.y) {
            return -1; 
        } else if (y > o.y) {
            return 1;
        } else {
            if (x < o.x) {
                return -1;
            } else if (x > o.x) {
                return 1;
            }
            return 0;
        }
    }

    public String toString() {
        return "x = " + x + " y = " + y;
    }
}

public class Temp {
    public static void main(String[] args) {
        ArrayList<Coordinate> A = new ArrayList<>();
        A.add(new Coordinate(1, 2));
        A.add(new Coordinate(2, 1));
        A.add(new Coordinate(3, 2));
        A.sort(null);
        System.out.println(A.toString());
    }
}


输出

[x = 2 y = 1, x = 1 y = 2, x = 3 y = 2]