java - 为什么我的二维数组克隆不止一次?

标签 java arrays multidimensional-array copy clone

我只想将“clues”数组复制到“board”数组一次。为什么复制一次线索数组会随着棋盘变化?

public class Ejewbo
{
    public static int[][] board = new int[9][9];
    public static int[][] clues = 
        {
            {0, 0, 0, 7, 0, 0, 0, 0, 0},
            {1, 0, 0, 0, 0, 0, 0, 0, 0},
            {0, 0, 0, 4, 3, 0, 2, 0, 0},
            {0, 0, 0, 0, 0, 0, 0, 0, 6},
            {0, 0, 0, 5, 0, 9, 0, 0, 0},
            {0, 0, 0, 0, 0, 0, 4, 1, 8},
            {0, 0, 0, 0, 8, 1, 0, 0, 0},
            {0, 0, 2, 0, 0, 0, 0, 5, 0},
            {0, 4, 0, 0, 0, 0, 3, 0, 0},
        };

    public static void main(String[] args)
    {
        Ejewbo.board = Ejewbo.clues.clone();
        test();
    }

    public static void printboth()
    {
        for (int j = 0; j < 9; j++)
        {
            for (int i = 0; i < 9; i++)
            {
                System.out.print(Ejewbo.board[j][i]);
                System.out.print(" ");
            }

            System.out.println();
        }

        System.out.println();

        for (int j = 0; j < 9; j++)
        {
            for (int i = 0; i < 9; i++)
            {
                System.out.print(Ejewbo.clues[j][i]);
                System.out.print(" ");
            }

            System.out.println();
        }

        System.out.println("-----");
    }

    public static void test()
    {
        for (int i = 0; i < 2; i++) //run twice to see issue
        {
            Ejewbo.board[0][0]++;
            printboth();
        }
    }
}

我希望线索数组不会改变,但它确实改变了。当棋盘发生变化时,线索也会发生变化。为什么?有没有更好的方法来复制这样的数组(而不是使用 .clone())?

编辑:第一个答案 here对我来说似乎是复制数组的好方法。

最佳答案

(下面的代码块未经测试)

当您调用时:

Ejewbo.board = Ejewbo.clues.clone();    

您正在创建浅拷贝。结果就是您观察到的行为,board[i][j] = 线索[i][j]。它们指向内存中的相同引用,因此对其中一个的任何更改也会对另一个进行更改。

你可以做的是用类似的东西迭代二维数组本身

for(int i=0; i<clues.length; i++) {
 for(int j=0; j<clues[i].length; j++) {
  board[i][j]=clues[i][j];
 }
}

注意,Arrays 类有一个用于复制一维数组内容的方法,称为 copyOf。所以上面的代码可以缩短为

for(int i=0; i<clues.length; i++) {
 board[i]=Arrays.copyOf(clues[i], board[i].length);
}

请注意,如果额外的元素或填充元素长度不匹配,Arrays.copyOf 方法将截断它们(即为您的 int 数组添加 0),但您可能会确保它们这样做。

关于java - 为什么我的二维数组克隆不止一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57223563/

相关文章:

JavaScript:创建文本框数组

javascript - 如何获取数组中5个最小值的索引?

javascript - 迭代二维数组并列出所有条目

c - 如何在 C 中传递指向多维数组的指针?

c# - Java是否区分值类型和引用类型

java - 当前使用 WSO2 Identity Server API 的示例

java - 从 MongoDB 存储和获取文档

java - 使用 TreeViewer/ViewContentProvider 在表的两列中指定数据

javascript - 表单 ID 重复

python - 没有越界和裁剪值的 Numpy 二维数组索引