我在使用 lambda 函数按不同列对 2D 数组进行排序时遇到一个问题。打击是代码:路径是 2D 数组。
Arrays.sort(paths,Comparator.<int[]>comparingInt(t->t[0]).thenComparingInt(s->s[1]));
Arrays.sort(paths,Comparator.<int[]>comparingInt(t->t[0]).thenComparingInt(s->s[1]));
会导致编译错误,为什么?
2:如果删除 thenComparingInt 函数,如下所示:
Arrays.sort(paths,Comparator.comparingInt(t->t[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