我在制作要使用的对象的副本并更改该副本的值时遇到问题,而是更改了我的两个对象的值。对象的代码。
public class Board {
private int[][] board;
public Board() {
board = new int[9][9];
}
public Board(int[][] layout){
board = layout;
}
public int[][] getBoard(){
return board;
}
public int getBoardValue(int y, int x){
return board[y][x];
}
public void insertValue(int v, int y, int x){
board[y][x] =v;
}
}
我试图开始工作的函数的代码
public Board copy(Board b) {
Node node = new Node(b);
int[][] layout = node.getBoard().getBoard();
Board temp = new Board(layout);
temp.insertValue(1,4,5);
return temp;
}
因此,当我尝试在新对象中插入值1时,旧对象仍会更改。
答案 0 :(得分:3)
public Board(int[][] layout){
board = layout;
}
这使得电路板和布局指向同一地址。尝试类似:
public Board(int[][] layout){
this();
for(int i=0; i<layout.length;i++)
for(int j=0; j<layout[0].length;j++)
board[i][j] = layout[i][j];
}
答案 1 :(得分:2)
将数组变量分配给现有数组时,不会获得新数组。你得到两个对同一个数组的引用。
例如:
int[] a = { 1, 2, 3};
int[] b = a;
a
和b
不是两个数组,而是对同一个数组的两个引用。随后更改a
与更改b
相同。
对于2D数组,还有另一个问题:数组int[][] x
实际上是一个包含其他数组序列的数组。因此,它的一个天真副本(int[][] y = x.clone()
)将为您提供两个int[][]
数组,其中包含对int[]
数组序列的共享引用。
要正确复制2D数组,需要复制其中的各个1D数组。
-
在您的情况下,两个对象都持有对同一数组的引用。如果您希望它们具有单独的阵列,则需要复制该阵列。您可以在构造函数中复制数组,如下所示:
public Board(int[][] layout) {
board = new int[layout.length][];
for (int i = 0; i < layout.length; ++i) {
board[i] = layout[i].clone();
}
}
答案 2 :(得分:1)
您还必须复制layout
数组。
public Board copy(Board b) {
Node node = new Node(b);
int[][] oldLayout = node.getBoard().getBoard();
int[][] newLayout = new int[9][9];
for(int i=0; i<newLayout.length; i++) {
newLayout[i] = Arrays.copyOf(oldLayout[i], oldLayout[i].length);
}
Board temp = new Board(newLayout);
temp.insertValue(1,4,5);
return temp;
}