矩阵转置是将原矩阵的行变为列、列变为行,新矩阵第i行第j列元素等于原矩阵第j行第i列元素;需新建数组,维度由m变为n,遍历赋值实现。

矩阵转置就是把原矩阵的行变成列、列变成行,即新矩阵第 i 行第 j 列的元素等于原矩阵第 j 行第 i 列的元素。对二维数组实现转置,关键在于新数组的行列维度要互换,并正确复制元素。
明确转置前后维度关系
假设原二维数组为 matrix[m][n](m 行 n 列),转置后应为 transposed[n][m](n 行 m 列)。不能直接在原数组上“原地”转置(除非是方阵且允许覆盖),一般需新建数组存储结果。
- 非方阵(m ≠ n)必须新建数组,否则索引越界
- 即使 m == n,原地转置也需小心处理下标,避免重复交换
- Java 中二维数组本质是“数组的数组”,
matrix.length是行数,matrix[0].length是列数(需确保非空且每行长度一致)
标准实现:新建数组逐元素赋值
最清晰安全的方式是遍历原数组每个位置 (i, j),将其赋给新数组的 (j, i) 位置。
public static int[][] transpose(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return new int[0][0];
}
int rows = matrix.length;
int cols = matrix[0].length;
int[][] transposed = new int[cols][rows]; // 行列互换
for (int i = 0; i
<h3>处理不规则二维数组(不推荐但需知晓)</h3>
<p>Java 允许“锯齿数组”(每行长度不同),此时严格意义上的矩阵转置无定义。若强行转置,需按最大列宽补零或截断:</p>
- 以最长行为基准:新数组列数 = 原数组最大行长度,缺失位置补 0
- 以最短行为基准:新数组列数 = 原数组最短行长度,超出部分丢弃
- 实际项目中应提前校验
matrix[i].length == matrix[0].length,否则抛出IllegalArgumentException
泛型支持与类型适配
上述示例针对 int 类型。如需支持任意引用类型(如 String、自定义对象),可用泛型方法(注意基本类型需用包装类):
public static <t> T[][] transpose(T[][] matrix) {
if (matrix == null || matrix.length == 0) return matrix;
int rows = matrix.length;
int cols = matrix[0].length;
@SuppressWarnings("unchecked")
T[][] transposed = (T[][]) new Object[cols][rows];
for (int i = 0; i
<p>注意:由于 Java 泛型擦除,此处需抑制未检查警告,且调用时需确保传入的是引用类型二维数组。</p></t>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











