我在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]
答案 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()))));