java二维数组的反转与转置是两种不同操作:行反转是上下颠倒各行顺序,不改变每行内部结构;转置是行列互换,要求规则矩阵,结果维度由m×n变为n×m,需新建数组并满足transposedj = originali。

Java 中二维数组的反转与重排不是一回事,混淆两者会导致结果完全错误。关键先分清目标:是把整行上下颠倒(即“行反转”),还是把行列坐标互换(即“转置”),又或是按某列值对所有行重新排序(即“按列重排”)。每种操作语义不同、实现方式不同、适用场景也不同。
行反转:让第一行变最后一行,逐行倒序
这是最直观的“反转”——不改变每行内部顺序,只调换行的位置。比如原数组 [[1,2,3],[4,5,6],[7,8,9]] 反转后应为 [[7,8,9],[4,5,6],[1,2,3]]。
- 用首尾双指针交换:设 start = 0,end = arr.length - 1,循环中交换 arr[start] 和 arr[end] 引用,然后 start++、end--
- 注意:这是引用交换,效率高;无需复制元素,也不影响每行内部结构
- 若数组不规则(各行长度不同),该方法依然安全,因为只动外层数组引用
转置:行列互换,适用于矩阵类操作
转置要求原数组是规则矩形(每行长度一致),结果维度从 m×n 变为 n×m。例如 [[1,2,3],[4,5,6]](2×3)转置后是 [[1,4],[2,5],[3,6]](3×2)。
- 不能原地完成(除非方阵且允许覆盖),需新建目标数组 int[n][m]
- 核心映射:原数组的 arr[i][j] → 新数组的 transposed[j][i]
- 常见错误是循环条件写成 j 却没校验 arr[i] 是否为空,应先判空再取长度
按列重排:以指定列为依据,对整行重新排序
这是表格排序的典型逻辑,例如按第1列(索引为1)升序排列所有行。原数组 [[3,"b"],[1,"a"],[2,"c"]] 按第0列排序后为 [[1,"a"],[2,"c"],[3,"b"]]。
- 使用 Arrays.sort(arr, Comparator),在 compare 方法中提取两行的目标列值比较
- 务必处理 null 或类型不匹配:可用 Objects.compare(a[1], b[1], Comparator.nullsLast(String::compareTo))
- 字符串数字如 "10" 和 "2" 直接比会错序,应先转数值:Integer.compare(Integer.parseInt(a[1]), Integer.parseInt(b[1])),并加 try-catch
避免常见陷阱
手写排序或反转时,几个细节极易出错:
- 嵌套循环中误用 i 做转置——这实际是遍历全部元素,而非构建转置关系
- 用四重循环暴力比较任意两个元素(如 matrix[i][j] > matrix[k][l] 就交换):这不是排序,是随机扰动,结果不可预测
- 对非规则二维数组调用 arr[0].length 获取列数前未校验 arr 和 arr[0] 是否为空,导致 NullPointerException
- 反转时写成 j 或漏掉 j 的限制,造成部分元素被交换两次,回到原位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











