Java 基于最多2个值排序Arraylist
我在Arraylist中有多个记录。要求根据2个属性对记录进行排序,即如果attribute1的值大于attribute2的值,则attribute1的记录位于属性2的记录之前 例如,如果我有以下列表: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
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()))));