比较器,用于在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[]

Comparator

这仅适用于对象数组,不适用于基本数组。对于原始数组,我们在T[] someArray = ... Arrays.sort(someArray,Comparator.<T>naturalOrder().reversed()) 中没有任何方法sort(int[],Comparator<...>)(可能是因为不能将原始用作通用类型,Ideone Demo将来可能会也可能不会更改)。

所以,是的,如果要保持恒定的内存开销,则对原始数组进行排序然后将其反转似乎是唯一的选择。看起来像这样(草图):

Arrays

project Valhalla

,

您可以使用Streamint转换为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,这是要测试的大量代码
  • 自定义比较器最常见的用例是反向排序,您可以通过先排序然后反转来实现