【问题标题】:When I shift the 2D-array to the left more than twice it replaces one of the numbers当我将二维数组向左移动两次以上时,它会替换其中一个数字
【发布时间】:2014-04-08 20:58:06
【问题描述】:
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

【问题讨论】:

  • 尝试调用 shiftLeft(array, 1, rowSel) num 次 - 这行得通吗?如果是这样,那么您的逻辑有问题,num > 1。
  • 它最终将其移至正确的编辑:哎呀。我看错了。是的,当更改为 1 时它确实有效

标签: java arrays 2d shift


【解决方案1】:

你有两个问题。

首先,这个:

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

您的循环终止条件k&lt;m-num 很糟糕。对于您的情况:m=4,num=3,所以这只评估一次,因为它实际上是k&lt;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];
}

【讨论】:

  • savedRow 应该代表什么?
  • 我更新了答案以澄清; savedRow 就像您原来的 int temp 一样,但暂时保留整行。如果有帮助,请务必给我的答案投票,如果有帮助,请选择“最佳”!
猜你喜欢
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多