我想在第二列上使用比较器对包含两列的数组进行排序,然后颠倒顺序。
数组是:
String[][] names = {{"a", "1234"}, {"b", "12312"}, {"c", "43"}};
并返回我使用的排序数组:
String[][] out = Arrays.stream(names)
.sorted(
Comparator.comparing(x -> x[1])
)
.toArray(String[][]::new);
哪种方法效果很好,但是当我尝试使用reversed()
来尊重排序顺序时:
String[][] out = Arrays.stream(names)
.sorted(
Comparator.comparing(x -> x[1]).reversed()
)
.toArray(String[][]::new);
我收到错误:
Error:(44, 66) java: array required, but java.lang.Object found
我的IDE突出显示了x[1]
部分中的 x 。我做错了什么?
答案 0 :(得分:3)
当您添加comparing()
链调用时,编译器无法将通用类型参数推断为.reversed()
,因此您必须明确地给它们。
首先,您需要了解comparing()
的完整声明:
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
它有两个类型参数:
T
- 函数的输入(lambda),即你的String[]
U
- 函数的返回值,即您案例中的String
所以你可以写:
Comparator.<String[], String>comparing(x -> x[1]).reversed()
或者,您可以在lambda中指定参数类型(即T
),编译器将推断U
。
Comparator.comparing((String[] x) -> x[1]).reversed()
这可能就是你想要的方式。
如果您愿意,也可以对第一个进行其中任何一个。这些都是一样的,只是变得越来越明确:
Comparator.comparing(x -> x[1])
Comparator.comparing((String[] x) -> x[1])
Comparator.<String[], String>comparing(x -> x[1])
Comparator.<String[], String>comparing((String[] x) -> x[1])