簡體   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