java - 如何按升序对二维数组进行排序?
问题描述
我有一个像这样的二维数组:
[0] [4]
[1] [3]
[0] [7]
[7] [8]
[1] [2]
[7] [3]
我想要这样的东西:
[0] [4]
[0] [7]
[1] [2]
[1] [3]
[7] [3]
[7] [8]
解决方案
使用比较器比较第一个单元格,然后如果相等,则比较第二个单元格。流式传输2D
数组时,结果是1D
数组流(在这种情况下长度为 2)。然后使用比较器对它们进行排序,然后作为2D
数组返回。
int[][] array = {{0, 4}, {1, 3}, {0, 7}, {7, 8}, {1, 2}, {7, 3}};
Comparator<int[]> first = Comparator.comparingInt(a -> a[0]);
Comparator<int[]> second = Comparator.comparingInt(a -> a[1]);
array = Arrays.stream(array)
.sorted(first.thenComparing(second))
.toArray(int[][]::new);
for (int[] a : array) {
System.out.println(Arrays.toString(a));
}
印刷
[0, 4]
[0, 7]
[1, 2]
[1, 3]
[7, 3]
[7, 8]
这是使用选择排序的非流方法。但是对于大型数据集不是很有效。
for (int i = 0; i < array.length - 1; i++) {
for (int k = i + 1; k < array.length; k++) {
// sort in ascending order on the first cells and then
// if equal, on the second cells
if (array[k][0] > array[i][0]
|| array[k][0] == array[i][0]
&& array[k][1] > array[i][1]) {
// simply swap each 1D array
int[] temp = array[i];
array[i] = array[k];
array[k] = temp;
}
}
}
或者正如Pshemo 所建议的那样,使用上述比较器。这会在不创建新数组的情况下进行就地排序。
Arrays.sort(array, first.thenComparing(second));
推荐阅读
- apache-spark - pyspark unix_timestamp 有时会返回 null
- ios - 使用 RunLoop.current.run 清理 SimplePing 代码
- node.js - 如何将处理后的数据推送到列表,然后从快递发送响应?
- node.js - NodeJs global.process
- c# - 如何在 C# 中合并 .txt 文件?
- python - 如何使用 pyopengl 加载和显示带有 .mtl 纹理的 .obj 文件
- excel - 如何强制 Excel 加载项在首次启动时加载默认设置
- export-to-excel - 在 C# windows 应用程序中使用 EPPlus 导出到 Excel 时引发了“System.OutOfMemoryException”类型的异常
- python - 生成器函数卡在第一个 if 子句中,有限状态机
- c++ - 为什么运算符删除重载不会在调用删除时调用无限递归调用