[英]How to sort a generic 2D array in ascending order?
我需要編寫一個通用方法,該方法將通用二維數組作為輸入並對其進行排序。 該方法應使用可比較或比較器。
到目前為止,我編寫的代碼如下所示:
public static <T extends Comparable<T>> void sort(T[][]stuff) {
T swap = stuff[0][0];
T temp;
for (T[] row : stuff) {
for (T elt : row) {
if (elt.compareTo(swap) > 0) {
temp= swap;
swap = elt;
elt = temp;
}
}
}
}
我從另一個 StackOverflow 帖子中獲得了這個想法,該帖子展示了如何從 2D 數組中獲取最大數字,而這些代碼所做的就是這個。
我將數組轉換為一維數組,然后進行排序,最后我將重新插入二維數組中的值:
public static <T extends Comparable<T>> void sort(T[][] stuff) {
List<T> list = new ArrayList<T>();
for (int i = 0; i < stuff.length; i++) {
for (int j = 0; j < stuff[i].length; j++) {
list.add(stuff[i][j]);
}
}
Collections.sort(list);
int len = stuff.length;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
stuff[i][j] = list.get(i * len + j);
}
}
}
您可以先將這個二維數組展平為一維數組,然后對平面數組進行排序,然后將二維數組的元素替換為排序后的平面數組中的元素。
public static <T extends Comparable<T>> void sort(T[][] array) {
// flatten a 2d array into a 1d array and sort it
Object[] sorted = Arrays.stream(array)
.flatMap(Arrays::stream)
.sorted(Comparator.naturalOrder())
.toArray();
// replace the elements of the 2d array
// with elements from the sorted flat array
AtomicInteger k = new AtomicInteger(0);
IntStream.range(0, array.length)
.forEach(i -> IntStream.range(0, array[i].length)
.forEach(j -> array[i][j] = (T) sorted[k.getAndIncrement()]));
}
public static void main(String[] args) {
String[][] arr1 = {{"a", "b", "e"}, {"f", "d", "g"}, {"h", "c", "i"}};
Integer[][] arr2 = {{3, 1, 4}, {5, 2}, {7}, {8, 6, 9}};
sort(arr1);
sort(arr2);
// output
System.out.println(Arrays.deepToString(arr1));
// [[a, b, c], [d, e, f], [g, h, i]]
System.out.println(Arrays.deepToString(arr2));
// [[1, 2, 3], [4, 5], [6], [7, 8, 9]]
}
另請參閱:按升序對整個二維數組進行排序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.