You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:15:02