Java 基于最多2个值排序Arraylist

Java 基于最多2个值排序Arraylist,java,Java,我在Arraylist中有多个记录。要求根据2个属性对记录进行排序,即如果attribute1的值大于attribute2的值,则attribute1的记录位于属性2的记录之前 例如,如果我有以下列表: Record 1 : Attr1:12 Attr2:10 Record 2 : Attr1:15 Attr2:12 Record 3 : Attr1:14 Attr2:18 Record 4 : Attr1:16 Attr2:14 Record 5 : Attr1:8 At

我在Arraylist中有多个记录。要求根据2个属性对记录进行排序,即如果attribute1的值大于attribute2的值,则attribute1的记录位于属性2的记录之前

例如,如果我有以下列表:

Record 1 : Attr1:12   Attr2:10
Record 2 : Attr1:15   Attr2:12
Record 3 : Attr1:14   Attr2:18
Record 4 : Attr1:16   Attr2:14
Record 5 : Attr1:8    Attr2: 5
排序后的列表应首先包含记录3,因为Attr2的值最高为18,然后记录4,因为Attr1的值第二高为16,以此类推。因此结果列表为:

 Record 3
 Record 4
 Record 2
 Record 1
 Record 5
这是使用比较器中的调整可以实现的,还是需要实现自定义逻辑。我已经通过迭代该项的实现了一个自定义逻辑,但它已经成为一个非常冗长的代码。需要知道是否有更简单的方法

谢谢

编辑:我通过添加另一个属性maxVal解决了这个问题,该属性将保存attr1和attr2的最大值。然后在第三个属性上写入比较器。下面是代码片段。我只是想知道是否有一种更简单的方法,不使用第三个属性或对我的解决方案版本进行优化

数据类的构造函数:

Data(int n, int a, int b) {
this.recordNum = n;
this.scanNum = a;
this.recvNum = b;
this.maxVal = Math.max(a, b);
}
主要类别:

public static void main(String[] args) {

    Data a = new Data(1, 12, 10);
    Data a1 = new Data(2, 15, 12);
    Data a2 = new Data(3, 14, 18);
    Data a3 = new Data(4, 16, 14);
    Data a4 = new Data(5, 8, 5);

    List<Data> list = new ArrayList<Data>();
    list.add(a);
    list.add(a1);
    list.add(a2);
    list.add(a3);
    list.add(a4);

    System.out.println(list);

    Comparator<Data> comparetor = new Comparator<Data>() {

        @Override
        public int compare(Data o1, Data o2) {
            if (o1.getMaxVal() == o2.getMaxVal()) {
                return 0;
            } else {
                return (o1.getMaxVal() > o2.getMaxVal() ? 1 : -1);
            }

        }
    };

    Collections.sort(list, Collections.reverseOrder(comparetor));

    System.out.println(list);

}

您所做的是正确的,只是不需要显式存储最大值。您可以在比较期间取最大值

Comparator<Data> comparator = new Comparator<Data>() {
        @Override
        public int compare(Data o1, Data o2) {
            return Integer.compare(Math.max(o1.getScanNum(), 
                o1.getRecvNum()), Math.max(o2.getScanNum(), o2.getRecvNum()));
        }
    };

你能展示你的尝试吗?@user7我已经用我实现的自定义逻辑更新了帖子。。只是想知道是否有更好的方法。
Comparator<Data> comparator = new Comparator<Data>() {
        @Override
        public int compare(Data o1, Data o2) {
            return Integer.compare(Math.max(o1.getScanNum(), 
                o1.getRecvNum()), Math.max(o2.getScanNum(), o2.getRecvNum()));
        }
    };
Collections.sort(list, Collections.reverseOrder(Comparator.comparingInt(data -> 
         Math.max(data.getScanNum(), data.getRecvNum()))));