使用 Java Comparator 通过 lambda 对不同列的二维数组进行排序

问题描述 投票:0回答:1

我在使用 lambda 函数按不同列对 2D 数组进行排序时遇到一个问题。打击是代码:路径是 2D 数组。

  • Arrays.sort(paths,Comparator.<int[]>comparingInt(t->t[0]).thenComparingInt(s->s[1]));
    
  • 1:如果像这样删除
  • Arrays.sort(paths,Comparator.<int[]>comparingInt(t->t[0]).thenComparingInt(s->s[1]));
    

会导致编译错误,为什么?

2:如果删除 thenComparingInt 函数,如下所示:

  •    Arrays.sort(paths,Comparator.comparingInt(t->t[0]));
    

它有效,为什么?

java lambda
1个回答
0
投票

像下面这样的第一条语句将无法正确编译,因为它无法确定类型。

Comparator<int[]> comp1 = Comparator.comparingInt(t -> t[0])
            .thenComparingInt(s -> s[1]);

但是要将它们结合起来,你有两种选择。 第一个将起作用,因为第一个语句帮助编译器解析类型。 然后将第二部分连接到第一部分。

要将它们组合为一个单元,您必须使用

type witnessing
告诉编译器您要比较的类型来帮助编译器。 所以以下两者都可以工作。


Comparator<int[]> comp2 = Comparator.comparingInt(t -> t[0]);
comp2 = comp2.thenComparing(t -> t[1]);

Comparator<int[]> comp3 = Comparator.<int[]>comparingInt(t -> t[0])
    .thenComparingInt(s -> s[1]);     |___|   
                                        |
                                        |
                                     type witness
© www.soinside.com 2019 - 2024. All rights reserved.