如何按两个字段对数组列表进行排序

时间:2019-02-04 14:00:00

标签: java arrays sorting arraylist collections

我有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的第一个元素的值对字段进行排序。如果1st和2nd的值相等,我要根据第三个元素进行排序,其中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 

如何比较数组列表?

3 个答案:

答案 0 :(得分:5)

似乎Java编译器在推断泛型类型时遇到问题,您可以选择一些方法来克服此问题:

  1. 使用类型为Class.<GenericType>.method(Arguments)的类型提示:

    splitList.sort(Comparator.<Double[]>comparingDouble(a -> a[0]).thenComparingDouble(b -> b[2]));
    
  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;
});

答案 1 :(得分:2)

尝试一下:

    splitList.sort((a,b) -> {
        int r = a[0].compareTo(b[0]);
        if (r == 0) {
            r = a[2].compareTo(b[2]);
        }
        return r;
    });

答案 2 :(得分:1)

如果您使用Java 8或下一版本,则可以使用以下语言:

/test

要在控制台中打印:

login

或者您可以收集一个列表,然后也可以打印该列表:

splitList.stream()
            .sorted(Comparator.comparing((Double[] array) -> array[0])
                    .thenComparing(Comparator.comparing((Double[] array2) -> array2[2]).reversed()));

祝你好运!