Java二维矩阵列交换功能异常,输出结果不符合预期
问题分析与修复方案
嘿,我一眼就看出你代码里的问题了——核心是二维数组的浅拷贝坑加上交换时没有做值保护导致的覆盖。咱们一步步拆解:
为什么会出现重复值?
你用了int[][] swap = matrix.clone();来复制数组,但在Java里,二维数组本质是「数组的数组」,clone()只能拷贝外层数组的引用,内层的每一行数组还是和原数组matrix共享的。也就是说,swap[i]和matrix[i]指向的是同一个一维数组!
所以当你执行swap[i][c0] = matrix[i][c1];的时候,其实已经把matrix[i][c0]的值改成了matrix[i][c1]。接下来执行swap[i][c1] = matrix[i][c0];时,取到的matrix[i][c0]已经是刚修改后的matrix[i][c1]的值了,自然就出现了两行重复的结果。
两种修复方案
方案1:直接在原数组交换(推荐,更高效)
不需要额外的数组,用一个临时变量保存要交换的值,避免覆盖:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int row = scanner.nextInt(); int column = scanner.nextInt(); int[][] matrix = new int[row][column]; // 读取矩阵数据 for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { matrix[i][j] = scanner.nextInt(); } } int c0 = scanner.nextInt(); int c1 = scanner.nextInt(); // 用临时变量交换两列,避免值覆盖 for (int i = 0; i < row; i++) { int temp = matrix[i][c0]; matrix[i][c0] = matrix[i][c1]; matrix[i][c1] = temp; } // 输出结果 for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } } }
方案2:正确深拷贝数组(保留原数组的场景)
如果你需要保留原数组不被修改,就得对二维数组做深拷贝,也就是逐行复制每个元素:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int row = scanner.nextInt(); int column = scanner.nextInt(); int[][] matrix = new int[row][column]; // 读取矩阵数据 for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { matrix[i][j] = scanner.nextInt(); } } // 正确深拷贝二维数组:逐行复制 int[][] swap = new int[row][column]; for (int i = 0; i < row; i++) { swap[i] = matrix[i].clone(); } int c0 = scanner.nextInt(); int c1 = scanner.nextInt(); // 现在交换swap的列不会影响原matrix for (int i = 0; i < row; i++) { swap[i][c0] = matrix[i][c1]; swap[i][c1] = matrix[i][c0]; } // 输出结果 for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { System.out.print(swap[i][j] + " "); } System.out.println(); } } }
关键知识点回顾
- Java中二维数组的
clone()是浅拷贝,只会复制外层数组引用,内层数组还是共享的 - 交换两个变量/元素时,一定要用临时变量保存其中一个值,避免覆盖
内容的提问来源于stack exchange,提问作者Greta
相关产品推荐
相关产品推荐

