为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2021-11-17 15:04:02
我正在尝试编写一个比较器来比较 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;    }}现在我想让 Comparator 比较 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 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

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


查看完整回答
反对 回复 2021-11-17
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

使用比较器



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]


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信