当我将2D阵列向左移动两次以上时,它会替换其中一个数字

时间:2014-04-08 20:58:06

标签: java arrays 2d shift

public static void shiftLeft(int[][] array,int num, int rowSel) {
    int m = array[rowSel].length;
    int temp = array[rowSel][0];
    for (int k=0; k<m-num; k++){
        array[rowSel][k] = array[rowSel][k+num];
    }
    array[rowSel][m-num] = temp;


    System.out.println("Final array: ");
    for(int i = 0; i<array.length; i++){
        for(int j=0;j<array.length;j++){
            System.out.printf("%4d",array[i][j]);
        }
        System.out.println();
    }
}

示例输出

Enter number of rows: 
4

Enter number of columns: 
4

ArrayA

12  12  10  14
18   5   2   0
16   1   2   2
17  15   6  15

Which row [0..3] do you want to shift to the left?

2

How many times?

3

Final array: 

12  12  10  14
18   5   2   0
2   16   2   2
17  15   6  15

注意第3行将1更改为2

1 个答案:

答案 0 :(得分:1)

你有两个问题。

首先,这个:

for (int k=0; k<m-num; k++){
    array[rowSel][k] = array[rowSel][k+num];
}

您的循环终止条件k<m-num很糟糕。对于你的情况:m = 4,num = 3,所以这只评估一次,因为它实际上是k<1

另外:当你复制时,你正在覆盖你的行......所以以后复制会冒再次复制相同数字的风险。我想你需要这样的东西:

int[] savedRow = new int[m];
for (int k=0; k<m; k++){
    savedRow[k] = array[rowSel][k];
}
for (int k=0; k<m; k++){
    array[rowSel][k] = savedRow[(k+num)%m];
}