Java二维数组转置需新建n×m数组,将originali赋值给transposedj,行列索引严格交换;空数组需判空处理,避免NullPointerException。

Java 二维数组转置,核心就是把原矩阵的 第 i 行第 j 列 元素,放到新矩阵的 第 j 行第 i 列,即执行 transposed[j][i] = original[i][j]。这不是简单的“倒过来”,而是行列索引的严格交换,必须新建数组,不能原地修改。
明确新数组尺寸:行列数必须互换
原数组是 m 行 × n 列(如 int[m][n]),转置后一定是 n 行 × m 列(int[n][m])。常见错误是写成 new int[m][n] 或误用 matrix.length 和 matrix[0].length 顺序。
- 正确写法:
int[][] transposed = new int[matrix[0].length][matrix.length]; - 若原数组为空(
matrix == null || matrix.length == 0),应直接返回null或空二维数组(如new int[0][0]) - 若首行为空(
matrix[0] == null),需提前判空,否则访问matrix[0].length会抛NullPointerException
双层循环赋值:索引交换不能颠倒
外层遍历原数组的行(i),内层遍历该行的列(j),每次将 original[i][j] 赋给 transposed[j][i]。关键点在于:不是 transposed[i][j] = original[j][i]——那是索引没换,结果错位。
- 标准写法:
for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { transposed[j][i] = matrix[i][j]; } } - 即使原数组某行长度不一致(如
{{1,2}, {3}}),只要在内层用matrix[i].length控制边界,就不会越界;但这种不规则结构本身不满足数学转置定义
支持泛型与集合:突破 int[][] 的局限
基础版针对 int[][],实际项目常需适配其他类型或结构:
立即学习“Java免费学习笔记(深入)”;
-
double[][]、float[][]等,仅需替换类型声明,逻辑完全一致 - 泛型二维数组
T[][]无法直接new T[n][m](泛型擦除),须用Array.newInstance(clazz, n, m)创建 -
List<List<Integer>>可先统一转为二维数组再处理;或直接按行列重建:result.get(j).set(i, original.get(i).get(j)),注意提前初始化嵌套列表尺寸
典型应用场景与避坑提醒
转置不是理论练习,它真实驱动着图像旋转、数据透视、特征矩阵适配等任务:
- 图像顺时针旋转 90° = 先转置 + 再每行翻转;逆时针 = 先转置 + 每列翻转
- Excel “行列互换”功能底层即此逻辑,尤其在宽表转长表(pivot/unpivot)预处理中高频使用
- 机器学习中,样本×特征矩阵(
n_samples × n_features)常需转为特征×样本,以匹配某些算法输入要求 - 切记:不规则二维数组(各行长度不同)没有唯一转置定义;强行处理需补零/截断,属于自定义变换,不是严格数学转置


















