java多维数组转置

Ant*_*nen 15 java arrays

我有一个基于行的多维数组:

/** [row][column]. */
public int[][] tiles;
Run Code Online (Sandbox Code Playgroud)

我想将此数组转换为基于列的数组,如下所示:

/** [column][row]. */
public int[][] tiles;
Run Code Online (Sandbox Code Playgroud)

......但我真的不知道从哪里开始

Jas*_*ani 12

我看到所有答案都创建了一个新的结果矩阵.这很简单:matrix[i][j] = matrix[j][i];但是,在方形矩阵的情况下,您也可以就地执行此操作.

// Transpose, where m == n
for(int i = 0; i < m; i++) {
  for(int j = i+1; j < n; j++) {
    int temp = matrix[i][j];
    matrix[i][j] = matrix[j][i];
    matrix[j][i] = temp;
  }
}
Run Code Online (Sandbox Code Playgroud)

这对于较大的矩阵更好,其中创建新的结果矩阵在存储器方面是浪费的.如果它不是正方形,您可以创建一个具有NxM维度的新方法并执行不合适的方法.注意:对于就地,请注意j = i + 1; 它不是0.


Ken*_*ent 9

试试这个:

@Test
    public void transpose() {

        final int[][] original = new int[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
        for (int i = 0; i < original.length; i++) {
            for (int j = 0; j < original[i].length; j++) {
                System.out.print(original[i][j] + " ");
            }
            System.out.print("\n");
        }
        System.out.print("\n\n matrix transpose:\n");
        // transpose
        if (original.length > 0) {
            for (int i = 0; i < original[0].length; i++) {
                for (int j = 0; j < original.length; j++) {
                    System.out.print(original[j][i] + " ");
                }
                System.out.print("\n");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

输出:

1 2 3 4 
5 6 7 8 
9 10 11 12 


 matrix transpose:
1 5 9 
2 6 10 
3 7 11 
4 8 12 
Run Code Online (Sandbox Code Playgroud)

  • 那只会打印出更改。它实际上并没有改变数组。 (3认同)

luk*_*302 5

我只是在挖掘这个话题,因为我没有在答案中找到有效的解决方案,因此,我将发布一个解决方案来帮助任何搜索该解决方案的人:

public int[][] transpose (int[][] array) {
  if (array == null || array.length == 0)//empty or unset array, nothing do to here
    return array;

  int width = array.length;
  int height = array[0].length;

  int[][] array_new = new int[height][width];

  for (int x = 0; x < width; x++) {
    for (int y = 0; y < height; y++) {
      array_new[y][x] = array[x][y];
    }
  }
  return array_new;
}
Run Code Online (Sandbox Code Playgroud)

您应该通过以下方式调用它:

int[][] a = new int[][] {{1,2,3,4},{5,6,7,8}};
for (int i = 0; i < a.length; i++) {
  System.out.print("[");
  for (int y = 0; y < a[0].length; y++) {
    System.out.print(a[i][y] + ",");
  }
  System.out.print("]\n");
}

a = transpose(a); // call
System.out.println("");

for (int i = 0; i < a.length; i++) {
  System.out.print("[");
  for (int y = 0; y < a[0].length; y++) {
    System.out.print(a[i][y] + ",");
  }
  System.out.print("]\n");
} 
Run Code Online (Sandbox Code Playgroud)

它将按预期输出:

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

[1,5,]
[2,6,]
[3,7,]
[4,8,]
Run Code Online (Sandbox Code Playgroud)