[英]Comparator for sorting 2D arrays and 1D arrays in Java
我使用以下代码通过使用比较器以相反的顺序对 int[][] 类型的二维数组进行排序。
int[][] arr = {{2,3},{3,5},{5,8}};
Arrays.sort(arr, (a,b) -> Integer.compare(b[1], a[1]));
但是我无法使用类似的方法对 int[] 类型的一维数组进行排序。 在互联网上,我发现信息说“按降序对原始数组进行排序的唯一方法是,首先按升序对数组进行排序,然后将数组反转到位。”
为什么我能够对原始类型的二维数组进行排序,但不能使用比较器对一维数组进行排序?
可以按降序对int[][]
进行排序,因为基本上是将int[]
相互比较。 根据JLS,§10 :“ ... Arrays 是对象... ”。
仔细Arrays
API,我们发现方法sort(T[], Comparator<? super T>)
,它与一些 static 对象的排序构建器方法一起,允许从Comparator
:
T[] someArray = ...
Arrays.sort(someArray, Comparator.<T>naturalOrder().reversed())
这仅适用于对象数组,不适用于原始 arrays。 对于原语 arrays,我们在Arrays
中没有任何方法sort(int[], Comparator<...>)
(可能是因为不能将原语用作泛型类型, Valhalla 项目将来可能会也可能不会改变这一点)。
所以是的,如果一个人想要有恒定的 memory 开销,那么对一组基元进行排序然后反转它似乎是唯一的选择。 它看起来像这样(草图):
final int[] values = { 1, 5, 3, 2, 4 };
Arrays.sort(values);
reverse(values);
您可以使用Stream
将int
转换为Integer
,使用Comparator
进行排序并将其重新转换为int[]
。
final int[] values = {2, 0, 5, 1, 3, 4};
int[] reversed = IntStream.of(values)
.boxed()
.sorted(Comparator.reverseOrder())
.mapToInt(i -> i)
.toArray();
System.out.println(Arrays.toString(reversed));
output:
[5, 4, 3, 2, 1, 0]
没有任何内置的排序方法可以接受一维原始数组和Comparator
。
至于为什么,只有设计师可以权威地说,但这里有一些 arguments 反对拥有它们:
Comparator
的sort
实现需要将每个数组元素包装在 object 中以将它们传递给Comparator
,因此您不妨让用户自己将int
数组转换为Integer
数组。Arrays.sort
实现,这是要测试的大量代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.