[英]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.