基于最多2个值对Arraylist进行排序

时间:2018-03-19 12:30:20

标签: 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    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);

}

输出:

[RecordNumber: 3 Scan: 14, recvNum: 18, RecordNumber: 4 Scan: 16, recvNum: 14, RecordNumber: 2 Scan: 15, recvNum: 12, RecordNumber: 1 Scan: 12, recvNum: 10, RecordNumber: 5 Scan: 8, recvNum: 5]

1 个答案:

答案 0 :(得分:0)

您所做的是正确的,除了不需要明确存储最大值。你可以在比较期间取最大值

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