作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只想将“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/
我是一名优秀的程序员,十分优秀!