首页 > 解决方案 > 如何按升序对二维数组进行排序?

问题描述

我有一个像这样的二维数组:

[0] [4]
[1] [3]
[0] [7]
[7] [8]
[1] [2]
[7] [3]

我想要这样的东西:

[0] [4]
[0] [7]
[1] [2]
[1] [3]
[7] [3]
[7] [8]

标签: javaarrayssortingmultidimensional-array

解决方案


使用比较器比较第一个单元格,然后如果相等,则比较第二个单元格。流式传输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));

推荐阅读