gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:32:21 25 4
gpt4 key购买 nike

我只想将“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com