我正在使用2D数组,而我在下面的方法中尝试做的是交换两个值。 ' currentBoard'变量是一个不需要编辑的二维数组。 ' cpy'变量是' currentBoard'的复制品。并且需要改变它的变量。 ' NBT'和''是一维数组,用于指向2D数组中的索引。功能代码' copyBoard'如果它有帮助,总是在下面
我遇到的问题是,在标有**的行上,当&c; cpy'由于某种原因,数组被更改为' currentBoard'正在改变。我真的无法弄清楚为什么会发生这种情况......
private void Swap(int[] nbt, int[] bt, ArrayList<State> children, String direction) {
int[][] cpy = copyBoard(currentBoard);
int temp = cpy[nbt[0]][nbt[1]];
**cpy[nbt[0]][nbt[1]] = currentBoard[bt[0]][bt[1]];
cpy[bt[0]][bt[1]] = temp;
children.add(new Board(cpy, this.getGOAL(), this.getRows(), this.getColumns(), (this.getDirections() + direction + ", ")));
}
如果它有帮助,那么当代码在标有**的行上时,分配给变量的值
nbt = {1,0} bt = {0,0}
private int[][] copyBoard(int[][] state)
{
int[][] returnArray = new int[rows][columns];
for (int i = 0, j = 0; i*j < PUZZLE_SIZE; i++, j++)
{
returnArray[i] = state[i];
}
return returnArray;
}
答案 0 :(得分:6)
2D数组是对数组的引用数组。因此,如果您指定returnArray[i] = state[i]
,则只需要returnArray[i]
引用state[i]
引用的相同数组。因此,修改returnArray[i][j]
将修改任何state[i]
的第j个元素。您还必须创建“行”的深层副本,例如:
private int[][] copyBoard(int[][] state)
{
int[][] returnArray = new int[rows][columns];
for (int i = 0, j = 0; i*j < PUZZLE_SIZE; i++, j++)
{
// deep copy of row:
returnArray[i] = Arrays.copyOf(state[i], state[i].length);
}
return returnArray;
}
查看this short write-up on 2D arrays,它可以让您更好地了解这里发生了什么。特别是,这个小图像代表int nums[][] = new int[5][4]
(虽然它在上下文中更有意义):
顺便说一下,你的循环逻辑对我来说有点奇怪;即使数学在你的情况下发生了变化,也可以更清楚地做到这一点:
for (int i = 0; i < rows; i++)
或更一般地说:
for (int i = 0; i < returnArray.length; i++)
当然,这些假设是state.length == rows
;但是你明白了。