Java中矩阵行列交换代码异常:正确性排查求助
代码问题分析与修复方案
问题根源
你的代码将列交换和行交换操作放在同一个k循环中执行,导致两类操作互相干扰:
- 当
k等于i或j时,列交换会先修改vector[i][i]、vector[i][j]、vector[j][i]、vector[j][j]这些交叉位置的元素; - 后续行交换再操作这些位置时,使用的已经是被列交换修改过的值,最终导致部分位置结果错误。
另外,原代码行交换部分使用vector.length作为循环上限,若矩阵为非方阵(行数≠列数),会出现数组越界或交换不完整的问题。
修复后的代码
将列交换和行交换拆分为两个独立的循环,确保两类操作互不干扰,同时适配非方阵场景:
public static void intercambiar(int[][] vector, int i, int j) { // 交换第i列与第j列的所有元素 for (int k = 0; k < vector.length; k++) { int temp = vector[k][j]; vector[k][j] = vector[k][i]; vector[k][i] = temp; } // 交换第i行与第j行的所有元素 for (int k = 0; k < vector[0].length; k++) { int temp = vector[j][k]; vector[j][k] = vector[i][k]; vector[i][k] = temp; } }
逻辑说明
- 先完整执行列交换循环:遍历每一行,交换该行第i列和第j列的元素,完成所有列交换后,矩阵的列状态稳定;
- 再独立执行行交换循环:遍历每一列,交换该列第i行和第j行的元素,此时行交换操作不会被之前的列交换干扰,结果完全符合预期。
内容的提问来源于stack exchange,提问作者David Rodríguez de Lope
相关产品推荐
相关产品推荐

