【问题标题】:How to organize columns of 2D array based on sum of columns?如何根据列的总和组织二维数组的列?
【发布时间】:2020-07-28 01:54:12
【问题描述】:

我想按每列总和的降序组织一个二维数组。例如:

3 1 1
2 6 5
5 4 2

第 1 列的总和为 10,第 2 列为 11,第 3 列为 8。第 2 列和第 1 列需要切换以降序排序。更新后的二维数组为:

1 3 1
6 2 5
4 5 2

我知道Collections.reverseOrder(),但这仅适用于按降序对一维数组进行排序。

这是我用来获取每列总和的代码:

int tempSum = 0;
for (int i = 0; i < columns; i++) {
    for (int j = 0; j < rows; j++) {
        tempSum = array[i][j]
    }
    //reset tempSum
    tempSum = 0;
}

我目前没有对每列的 tempSum 做任何事情。任何指导都会很棒。

【问题讨论】:

    标签: java arrays sorting multidimensional-array


    【解决方案1】:

    试试这个。

    int[][] transpose(int[][] matrix) {
        int rows = matrix.length, cols = matrix[0].length;
        int[][] transposed = new int[cols][rows];
        for (int r = 0; r < rows; ++r)
            for (int c = 0; c < cols; ++c)
                transposed[c][r] = matrix[r][c];
        return transposed;
    }
    

    int[][] m = {
        {3, 1, 1, 9},
        {2, 6, 5, 4},
        {5, 4, 2, 6}};
    m = transpose(m);
    Arrays.sort(m, Collections.reverseOrder(Comparator.comparingInt(row -> IntStream.of(row).sum())));
    m = transpose(m);
    for (int[] row : m)
        System.out.println("\t" + Arrays.toString(row));
    

    输出

    [9, 1, 3, 1]
    [4, 6, 2, 5]
    [6, 4, 5, 2]
    

    或者如果您需要更高的性能

    m = transpose(m);
    m = Arrays.stream(m)
        .map(row -> new Object() {
            int sum = IntStream.of(row).sum();
            int[] origin = row;
        })
        .sorted((a, b) -> Integer.compare(b.sum, a.sum))
        .map(obj -> obj.origin)
        .toArray(int[][]::new);
    m = transpose(m);
    

    【讨论】:

    • 谢谢,我的实际问题需要矩阵是灵活的,这个解决方案只适用于 3x3。如果我想将此应用于 3x4 矩阵,则会出现索引超出范围错误。
    • 更新了我的答案。
    • 哇太棒了。干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多