如何排序两场阵列表

问题描述 投票:2回答:3

我有双阵列的名单,我想根据第一和最后一个字段排序。到目前为止,我能够通过仅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

我想根据数组的第一个元素的值进行排序字段。如果第一和第二值是相等的我想根据第三元件,其中第一应为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 

我怎么能比较数组列表?

java arrays sorting arraylist collections
3个回答
5
投票

好像Java编译器在infering泛型类型的问题,你有一些选项来解决这个问题:

  1. 使用类型提示与模式Class.<GenericType>.method(Arguments)splitList.sort(Comparator.<Double[]>comparingDouble(a -> a[0]).thenComparingDouble(b -> b[2]));
  2. 声明拉姆达参数类型(宣布它的第一似乎是不够的): 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;
});

2
投票

尝试这个:

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

1
投票

如果应用了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));
}

祝您好运!

© www.soinside.com 2019 - 2024. All rights reserved.