【问题标题】:Inverting a two-dimensional array反转二维数组
【发布时间】:2018-12-15 09:11:35
【问题描述】:

我正在尝试反转和翻转一个二维数组,但是出了点问题!翻转工作正常,但反转不是。 在这里找不到错误:

public int[][] flipAndInvert(int[][] A) {
    int row = -1;
    int col = -1;
    int[][] arr = A;

    for (int i = 0; i < arr.length; i++) {
        row++;
        col = -1;
        for (int j = arr[i].length - 1; j >= 0; j--) {
            col++;
            arr[row][col] = A[i][j];
        }
    }
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) {
            if (arr[i][j] == 1) {
                arr[i][j] = 0;
            } else {
                arr[i][j] = 1;
            }
        }
    }
    return arr;
}
int[][] A = { { 0, 1, 1 },{ 0, 0, 1 },{ 0, 0, 0 } };

继续之后的输出应该是: 反转后: {1,1,0},{1,0,0},{0,0,0} 翻转后: {0,0,1,},{0,1,1},{1,1,1}

非常感谢大家,问题出在这里: int[][] arr = A; 数组的引用正在传递给 arr。

【问题讨论】:

  • 您能分享一个示例二维数组以及您想要得到的结果吗?这将有助于使问题更清楚。
  • 出了什么问题?实际输出与您的预期输出有何不同?
  • @Mureinik 添加了
  • 您的翻转不起作用。我从输入数组{ {0,1,1}, {0,1,1}, {0,1,1} } 得到{ {1,1,1}, {1,1,1}, {1,1,1}。这似乎不是你想要的。
  • @mypetlion 前两个“for”循环正在反转,接下来的两个翻转数组,所以我在这里找不到错误

标签: java arrays reverse flip inversion


【解决方案1】:

我的想法是,既然你正在使用这条线:

int[][] arr = A;

数组的引用被传递给 arr,因此行:

arr[row][col] = A[i][j];

相当于:

A[row][col] = A[i][j];

因为 arr 引用了 A 并且它们现在都引用相同的内存位置(或者它们对于单个变量都是不同的名称)

您可以通过使用带有 arr 的 new 关键字然后对其进行初始化来解决此问题:

int[][] arr = new int[someRows][someCols];
//use for loop to assign the value to each element of arr

或者你可以运行 for 循环直到 arr[i].length/2 - 1:

    for (int i = 0; i < arr.length; i++) {
    row++;
    col = -1;
    for (int j = arr[i].length / 2 - 1; j >= 0; j--) { //here changed arr[i].length to arr[i].length / 2
        col++; 
        arr[row][col] = A[i][j]; //for this you do not need arr and you can directly work on A and return it
    }
}

【讨论】:

    【解决方案2】:

    你的代码的问题应该是这一行:

    int[][] arr = A;
    

    您将数组A 的引用分配给arr,然后当您修改一个数组时,您修改了两个数组,或者更好的是它们一起修改,因为它们引用相同的地址。

    【讨论】:

      【解决方案3】:

      使用 apache commons 语言:

          int[][] matrix = new int[3][3];
          for (int i = 0; i < matrix.length; i++) {
              matrix[i][0] = 3 * i;
              matrix[i][1] = 3 * i + 1;
              matrix[i][2] = 3 * i + 2;
          }
      
          System.out.println(Arrays.toString(matrix[0]));
          System.out.println(Arrays.toString(matrix[1]));
          System.out.println(Arrays.toString(matrix[2]));
      
          ArrayUtils.reverse(matrix);
      
          System.out.println(Arrays.toString(matrix[0]));
          System.out.println(Arrays.toString(matrix[1]));
          System.out.println(Arrays.toString(matrix[2]));
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 2018-03-03
        • 1970-01-01
        • 2021-05-22
        • 2021-05-02
        相关资源
        最近更新 更多