[英]How to sort List of Array by two fields
我有Double Array列表,我想根据第一个和最后一个字段对它进行排序。 到目前为止,我只能通过1个数组元素对其进行排序。
真实状态:
0 1 2
------- ------- -------
78 100 0
78 100 1
0 100 0
104 100 1
预期:
0 1 2
------- ------- -------
0 100 0
78 100 1
78 100 0
101 100 1
我想根据Array的第一个元素的值对字段进行排序。 如果第1和第2的值相等,我想根据第3个元素排序,其中first应该是1然后是0(将只有1和0值)
List<Double[]> splitList = new ArrayList<>();
Double[] tmp1 = { 78d, 100d, 0d };
Double[] tmp2 = { 78d, 100d, 1d };
Double[] tmp3 = { 0d, 100d, 0d };
Double[] tmp4 = { 104d, 100d, 1d };
splitList.add(tmp1);
splitList.add(tmp2);
splitList.add(tmp3);
splitList.add(tmp4);
splitList.sort(Comparator.comparingDouble(a -> a[0]));
这个根据第一个元素排序。 我发现解决方案按两个元素排序https://stackoverflow.com/a/26865122/9774735所以我试了一下:
splitList.sort(Comparator.comparingDouble(a -> a[0]).thenComparingDouble(b -> b[2]));
它输出一个错误:
Multiple markers at this line
- The type of the expression must be an array type but it resolved
to Object
- The type of the expression must be an array type but it resolved
如何比较List of Array?
似乎java编译器在推断泛型类型方面存在问题,您有一些选项可以解决此问题:
使用模式Class.<GenericType>.method(Arguments)
类型提示Class.<GenericType>.method(Arguments)
:
splitList.sort(Comparator.<Double[]>comparingDouble(a -> a[0]).thenComparingDouble(b -> b[2]));
声明lambda参数类型(声明第一个似乎就足够了):
splitList.sort(Comparator.comparingDouble((Double[] a) -> a[0]).thenComparingDouble(b -> b[2]));
阅读完评论后,您想要反转上次比较,可以这样做:
Comparator.<Double[]>comparingDouble(a -> a[0])
.thenComparing(Comparator.<Double[]>comparingDouble(b -> b[2]).reversed())
这是非常混乱的,你最好使用这样的东西:
splitList.sort((a, b) -> {
int c = Double.compare(a[0], b[0]);
return c == 0 ? Double.compare(b[2], a[2]) : c;
});
尝试这个:
splitList.sort((a,b) -> {
int r = a[0].compareTo(b[0]);
if (r == 0) {
r = a[2].compareTo(b[2]);
}
return r;
});
如果您使用java 8或下一版本,您可以使用:
splitList.stream()
.sorted(Comparator.comparing((Double[] array) -> array[0])
.thenComparing(Comparator.comparing((Double[] array2) -> array2[2]).reversed()));
在控制台中打印:
splitList.stream()
.sorted(Comparator.comparing((Double[] array) -> array[0])
.thenComparing(Comparator.comparing((Double[] array2) -> array2[2]).reversed()))
.forEach(array -> System.out.println(Arrays.toString(array)));
或者您可以在列表中收集,然后也可以打印列表:
List<Double[]> list = splitList.stream()
.sorted(Comparator.comparing((Double[] array) -> array[0])
.thenComparing(Comparator.comparing((Double[] array2) -> array2[2]).reversed()))
.collect(Collectors.toList());
for (Double[] array: list) {
System.out.println(Arrays.toString(array));
}
祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.