多维数组转置
2022-09-02 01:00:00
我有一个基于行的多维数组:
/** [row][column]. */
public int[][] tiles;
我想将此数组转换为基于列的数组,如下所示:
/** [column][row]. */
public int[][] tiles;
...但我真的不知道从哪里开始
我有一个基于行的多维数组:
/** [row][column]. */
public int[][] tiles;
我想将此数组转换为基于列的数组,如下所示:
/** [column][row]. */
public int[][] tiles;
...但我真的不知道从哪里开始
我看到所有的答案都创建了一个新的结果矩阵。这很简单:
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;
}
}
这对于较大的矩阵更好,因为在较大的矩阵中,创建新的结果矩阵在内存方面是浪费的。如果它不是正方形,则可以创建一个带有尺寸的新方法并执行不合适的方法。注意:对于就地,请照顾好 .它不是.NxM
j = i + 1
0
以下解决方案实际上返回转置的数组,而不仅仅是打印它,并且适用于所有矩形数组,而不仅仅是正方形。
public int[][] transpose(int[][] array) {
// empty or unset array, nothing do to here
if (array == null || array.length == 0)
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;
}
例如,您应该通过以下方式调用它:
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");
}
这将如预期的那样输出:
[1,2,3,4,]
[5,6,7,8,]
[1,5,]
[2,6,]
[3,7,]
[4,8,]