You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:43:09