如何使用Java Comparator对二维数组按元素差值降序排序并解决reversed报错
报错原因
这个问题是Java泛型类型推断的限制导致的:
- 你直接写
Arrays.sort(arr, Comparator.comparing(a -> a[0] - a[1]))时,编译器可以从sort方法的入参要求(Comparator<Integer[]>)推断出lambda的参数a是Integer[]类型,所以代码可以正常运行。 - 当你链式调用
reversed()时,编译器无法跨链式调用传递泛型类型信息,会默认把lambda的参数a推断为Object类型,而Object没有数组下标访问的语法,因此就会抛出「需要数组类型,找到java.lang.Object类型」的错误。
解决方案
你可以通过以下任意一种方式解决问题:
方案1:显式指定lambda参数类型
直接给lambda的入参声明类型,明确告知编译器a的类型:
Arrays.sort(arr, Comparator.comparing((Integer[] a) -> a[1] - a[0]).reversed());
方案2:先声明Comparator变量再调用reversed
将Comparator先赋值给明确指定泛型的变量,再调用反转方法:
Comparator<Integer[]> diffComparator = Comparator.comparing(a -> a[1] - a[0]); Arrays.sort(arr, diffComparator.reversed());
方案3:使用基础类型专属的比较器(推荐)
用comparingInt避免自动拆箱的性能损耗,同时显式指定参数类型:
Arrays.sort(arr, Comparator.comparingInt((Integer[] a) -> a[1] - a[0]).reversed());
第一次代码报错的补充说明
你最开始写的Comparator.comparing(arr, (Integer[] a, Integer[] b) -> a[1] + b[1] - a[0] - b[0])参数完全错误:
Comparator.comparing的第一个入参是「key提取函数」,不是待排序的数组,你错误传入了arr,参数不匹配导致编译器无法识别函数式接口类型,所以报错。
内容的提问来源于stack exchange,提问作者dionot
相关产品推荐
相关产品推荐

