如何将总和为负的列移动到最后?

How to move columns whose sum is negative to the end?

例如:我有一个数组:

int[][] arr = {{-3,1,-5,2,-1},
               {-3,1,-5,2,-2},
               {-3,1,-5,2,-3}};

我需要得到这样一个数组:

int[][] arr = {{1,2,-3,-5,-1},
               {1,2,-3,-5,-2},
               {1,2,-3,-5,-3}};

我希望该程序对任何双精度数组都是通用的。


有什么想法吗?

这是一种方法。这仅适用于矩形阵列,因为如果任何正总和列短于负总和列,则不可能保持列对齐。

int[][] arr = { { -3, 1, -5, 2, -1 },
                { -3, 1, -5, 2, -2 },
                { -3, 1, -5, 2, -3 } };

首先创建一个列总和数组。

int[] colsum = new int[arr[0].length];

for (int col = 0; col < arr[0].length; col++) {
    for (int row = 0; row < arr.length; row++) {
           colsum[col] += arr[row][col];
    }       
}

然后,创建一个结果数组以根据列总和复制列。 为了保留相同符号列的相对列顺序,使用了两个循环。第一个从右到左。第二个从左到右,但也会在到达之前添加的负数列后停止。

int[][] result = new int[arr.length][arr[0].length];

int rearLoc = arr[0].length-1;
int forwardLoc = 0;
for (int col = arr[0].length-1; col >= 0; col--) {
    if (colsum[col] < 0) {
         for (int row = 0; row < arr.length; row++) {
               result[row][rearLoc] = arr[row][col];
         }
         rearLoc--;
    }
}
for (int col = 0;  forwardLoc <= rearLoc && col < arr[0].length; col++) {
    if (colsum[col] >= 0) {
        for (int row = 0; row < arr.length; row++) {
            result[row][forwardLoc] = arr[row][col];
        }
        forwardLoc++;
    }
}
for (int[] a : result) {
    System.out.println(Arrays.toString(a));
}

版画

[1, 2, -3, -5, -1]
[1, 2, -3, -5, -2]
[1, 2, -3, -5, -3]