如何解决比较器,用于在Java中对2D数组和1D数组进行排序
我使用以下代码通过使用比较器以相反的顺序对int [] []类型的2D数组进行排序。
int[][] arr = {{2,3},{3,5},{5,8}};
Arrays.sort(arr,(a,b) -> Integer.compare(b[1],a[1]));
但是我无法使用类似的方法对int []类型的一维数组进行排序。在互联网上,我发现信息说:“按降序对原始数组进行排序的唯一方法是,首先按升序对数组进行排序,然后将其反转就位。”
为什么我可以使用比较器对原始类型的2D数组进行排序,但不能对1D数组进行排序?
解决方法
可以对PROCEDURE Calc
PARAMETER apples,bananas
IF TYPE([bananas])#[C]
bananas=[] && What is this right here? Empty string? Empty array? Dynamic?
ENDIF
RETURN
进行降序排序,因为基本上可以将int[][]
相互比较。根据{{3}}:“ ...数组是对象... ”。
更靠近JLS,§10,它与Arrays
API,we find method sort(T[],Comparator<? super T>)
中的一些静态生成器方法一起,可以对对象数组进行反向排序:
int[]
这仅适用于对象数组,不适用于基本数组。对于原始数组,我们在T[] someArray = ...
Arrays.sort(someArray,Comparator.<T>naturalOrder().reversed())
中没有任何方法sort(int[],Comparator<...>)
(可能是因为不能将原始用作通用类型,Ideone Demo将来可能会也可能不会更改)。
所以,是的,如果要保持恒定的内存开销,则对原始数组进行排序然后将其反转似乎是唯一的选择。看起来像这样(草图):
Arrays
,
您可以使用Stream
将int
转换为Integer
,使用Comparator
进行排序并将其重新转换为int[]
。
final int[] values = {2,5,1,3,4};
int[] reversed = IntStream.of(values)
.boxed()
.sorted(Comparator.reverseOrder())
.mapToInt(i -> i)
.toArray();
System.out.println(Arrays.toString(reversed));
输出:
[5,4,2,0]
,
几乎没有任何内置的排序方法可以接受一维基本数组和Comparator
。
关于为什么,只有设计者可以权威地说,但是这里有一些反对使用它们的论点:
- 最初在Java程序中很少使用原始数组。
- 使用
sort
的{{1}}实现将需要将每个数组元素包装到一个对象中,以将它们传递给Comparator
,因此您最好让用户转换数组Comparator
本身变成int
的数组。 - 您需要再添加7或14个
Arrays.sort
implementations,这是要测试的大量代码 - 自定义比较器最常见的用例是反向排序,您可以通过先排序然后反转来实现
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。