Java二维数组行交换代码正确性校验及优化咨询
代码正确性说明
你当前的代码在入参符合预期的场景下是可以正确运行的,你给出的测试用例中交换第2、3行的输出结果符合预期:
2 1 4 3 6 2 1 2 3
可优化调整点
- 【缺失入参校验】现有代码没有对输入参数做合法性校验,遇到以下场景会直接抛出数组越界异常:
- 传入的矩阵为null、空矩阵
- 待交换的行号K、L小于1,或者大于矩阵总行数
- 矩阵为行长度不一致的锯齿数组时,原有逻辑用
matrix[0].length作为循环边界会导致部分列未交换/越界
- 【交换逻辑可简化】Java的二维数组本质是一维数组的数组,每一行对应一个一维数组对象,无需逐元素交换,直接交换两行的引用即可,效率更高且天然适配锯齿数组:
// 替换原有循环交换逻辑即可 int[] temp = matrix[K - 1]; matrix[K - 1] = matrix[L - 1]; matrix[L - 1] = temp; - 【职责不清晰】
exchangeAnyTwoRows方法同时承担了交换行、打印矩阵两个职责,复用性较差,建议将打印逻辑剥离,交换方法仅做交换操作,需要打印时由调用方主动调用printMatrix方法。 - 【冗余导包】代码开头的
import java.util.*;没有被使用,可以直接删除。 - 【代码风格优化】
- 内层for循环建议补充大括号,避免后续新增代码时出现逻辑错误
- 参数名K、L建议改为小写的k、l,或者更表意的
targetRow1、targetRow2,符合Java小驼峰命名规范 - 可以在方法上补充JavaDoc注释说明参数含义、注意事项
优化后代码示例
public class Main { /** * 打印二维矩阵 * @param matrix 待打印的二维矩阵 */ public static void printMatrix(int[][] matrix) { if (matrix == null || matrix.length == 0) { return; } for (int[] row : matrix) { for (int num : row) { System.out.print(num + " "); } System.out.println(); } } /** * 交换矩阵的两行(行号从1开始计数) * @param matrix 待操作的矩阵 * @param row1 待交换的第一行行号 * @param row2 待交换的第二行行号 */ public static void exchangeAnyTwoRows(int[][] matrix, int row1, int row2) { // 入参校验 if (matrix == null || matrix.length < 2) { return; } int maxRowNum = matrix.length; if (row1 < 1 || row1 > maxRowNum || row2 < 1 || row2 > maxRowNum || row1 == row2) { return; } // 转换为0基索引 int index1 = row1 - 1; int index2 = row2 - 1; // 直接交换行引用 int[] temp = matrix[index1]; matrix[index1] = matrix[index2]; matrix[index2] = temp; } public static void main(String[] args) { int k = 2, l = 3; int mat[][] = { { 2, 1, 4 }, { 1, 2, 3 }, { 3, 6, 2 } }; exchangeAnyTwoRows(mat, k, l); printMatrix(mat); } }
内容的提问来源于stack exchange,提问作者adnanadel
相关产品推荐
相关产品推荐

