繁体   English   中英

用于在 Java 中排序 2D arrays 和 1D arrays 的比较器

[英]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())

Ideone 演示

这仅适用于对象数组,不适用于原始 arrays。 对于原语 arrays,我们在Arrays中没有任何方法sort(int[], Comparator<...>) (可能是因为不能将原语用作泛型类型, Valhalla 项目将来可能会也可能不会改变这一点)。

所以是的,如果一个人想要有恒定的 memory 开销,那么对一组基元进行排序然后反转它似乎是唯一的选择。 它看起来像这样(草图):

final int[] values = { 1, 5, 3, 2, 4 };
Arrays.sort(values);
reverse(values);

Ideone 演示

您可以使用Streamint转换为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 反对拥有它们:

  • 原语 arrays 在 Java 程序中并不经常使用。
  • 使用Comparatorsort实现需要将每个数组元素包装在 object 中以将它们传递给Comparator ,因此您不妨让用户自己将int数组转换为Integer数组。
  • 您需要再添加 7 或 14 个Arrays.sort实现,这是要测试的大量代码
  • 自定义比较器最常见的用例是反向排序,您已经可以通过先排序然后反向来实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM