Java二维数组submatrix方法意外修改原数组问题求助
问题根源
你写的int[][] copyArr = arr;根本没复制数组,只是把原数组的引用赋值给了copyArr。这俩变量指向内存里同一个二维数组,所以你修改copyArr的元素时,原数组自然会被改动。
解决方案
要真正复制二维数组,得做深拷贝——先复制外层数组,再逐个复制内层的每一行。修改后的代码如下:
import java.util.Arrays; public static int[][] submatrix(int[][] arr, int i, int j) { // 真正复制二维数组,避免修改原数组 int[][] copyArr = new int[arr.length][]; for (int k = 0; k < arr.length; k++) { copyArr[k] = Arrays.copyOf(arr[k], arr[k].length); } int[][] newArr = new int[copyArr.length - 1][copyArr[0].length - 1]; // 把指定行设为0 for(int k = 0; k < copyArr[0].length; k++) { copyArr[j - 1][k] = 0; } // 把指定列设为0 for(int x = 0; x < copyArr.length; x++) { copyArr[x][i - 1] = 0; } printMatrix(copyArr); System.out.println(); int row = 0; int col = 0; for(int x = 0; x < copyArr.length; x++) { for(int y = 0; y < copyArr[0].length; y++) { if(copyArr[x][y] != 0) { newArr[row][col] = copyArr[x][y]; col += 1; if(col == newArr[0].length) { col = 0; // 逻辑等价但可读性更好 row += 1; } } } } return newArr; }
关键说明
- 通过
new int[arr.length][]创建外层数组,再用Arrays.copyOf(arr[k], arr[k].length)复制每一行,让copyArr成为完全独立的新数组,修改它不会影响原数组arr。 - 把
col -= newArr[0].length改成col = 0,逻辑不变但代码更直观。
现在你多次调用这个方法处理同一个matrixI数组时,原数组会保持初始状态,每次调用都会基于原始数据生成子矩阵。
内容的提问来源于stack exchange,提问作者Kian Power
相关产品推荐
相关产品推荐

