如何反转 java 中的二维数组?

How to reverse a 2D array in java?

我正在尝试反转二维数组中的所有内容。最后一个值应该是第一个,第一个值应该是最后一个。

例如输入

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

会 return:

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

这是我到目前为止的一些代码,但它是 returning 这个:

9 8 3 
6 5 4 
7 2 1 
int[][] reverse = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
for(int i = 0; i <= (reverse.length / 2); i++) {
    for(int j = 0; j < (reverse[0].length / 2) + 1; j++) {
        System.out.println(i + " " + j);
        System.out.println((reverse.length-1-i) + " " + (reverse[0].length -1 -j));
        int temp = reverse[reverse.length-1-i][reverse[0].length -1 -j];
        reverse[reverse.length-1-i][reverse[0].length - 1 - j] = reverse[i][j];
        reverse[i][j] = temp;
     }
}
for(int i = 0; i < reverse.length; i++) {
  for(int j = 0; j < reverse[0].length; j++) {
       System.out.print(reverse[i][j]+" ");
  }
  System.out.println("");
}

如何解决这个问题,让 3 和 7 互换?

你的代码的问题是你在循环 3。外层循环从 0 到 1,内层循环从 0 到 2,所以你只能交换这些元素及其对应的元素“on另一边":

1 2
4 5
7 8

您实际上想将它们与另一侧的元素交换:

1 2 3
4 

基本上,如果要交换元素,您需要使用元素的数量而不是行数和列数来找到中间点。

int rows = reverse.length;
int cols = reverse[0].length;
int total = rows * cols;
int half = total / 2; // calculate halfway point

for(int n = 0; n < half; n++) {
  // convert the nth element to a coordinate
  int i = n / cols;
  int j = n % cols;

  int temp = reverse[rows - 1 - i][cols - 1 - j];
  reverse[rows- 1 - i][cols - 1 - j] = reverse[i][j];
  reverse[i][j] = temp;
}

如果你要找到行和列的中间点,那么你应该反转行,反转每行内的元素。我实际上认为这是一种更直观的方法。

int rows = reverse.length;
int cols = reverse[0].length;

// reverse the rows
for (int i = 0 ; i < rows / 2; i ++) {
  int[] temp = reverse[i];
  reverse[i] = reverse[rows - 1 - i];
  reverse[rows - 1 - i] = temp;
}

// for each row, reverse the elements inside the rows
for (int i = 0 ; i < rows; i ++) {
  for (int j = 0 ; j < cols / 2 ; j++) {
    int temp = reverse[i][j];
    reverse[i][j] = reverse[i][cols - 1 - j];
    reverse[i][cols - 1 - j] = temp;
  }
}

您应该编写它以保留第一个单元格的 x/y 坐标和最后一个单元格的另一个 x/y 坐标,然后交换单元格值。分别推进坐标right/down和left/up,直到相遇

优点是生成的代码也可以处理锯齿状数组。

static void test(int[][] arr) {
    for (int y1 = 0, x1 = 0, y2 = arr.length - 1, x2 = arr[y2].length - 1; y1 < y2 || (y1 == y2 && x1 < x2); ) {
        int temp = arr[y1][x1];
        arr[y1][x1] = arr[y2][x2];
        arr[y2][x2] = temp;
        if (++x1 == arr[y1].length) {
            y1++;   x1 = 0;
        }
        if (x2-- == 0) {
            y2--;   x2 = arr[y2].length - 1;
        }
    }
    for (int y = 0; y < arr.length; y++) {
        for (int x = 0; x < arr[y].length; x++) {
            if (x != 0)
                System.out.print(" ");
            System.out.print(arr[y][x]);
        }
        System.out.println();
    }
}

测试

test(new int[][] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
test(new int[][] {{1, 2}, {3, 4, 5}, {6, 7, 8, 9}});

输出

9 8 7
6 5 4
3 2 1
9 8
7 6 5
4 3 2 1

你的内部循环需要迭代到每一行的末尾,而不是中间,你需要分别处理奇数行数组的中间行:

static void reverse(int[][] arr)
{
    int m = arr.length;
    int n = arr[0].length;

    for(int i=0; i<m/2; i++)
        for(int j=0; j<n; j++)
            swap(arr[i], j, arr[m-1-i], n-1-j);
    
    if(m % 2 == 1) 
    {
        int[] mid = arr[m/2];
        for(int j=0; j<n/2; j++)
            swap(mid, j, mid, n-1-j);
    }
}
 


static void swap(int[] a, int i, int[] b, int j)
{
    int tmp = a[i];
    a[i] = b[j];
    b[j] = tmp;
}

测试:

int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
reverse(arr);       
for(int[] row : arr) System.out.println(Arrays.toString(row));

输出:

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