Java更改2D数组中的值

Bre*_*her 0 java arrays multidimensional-array

我正在使用2D数组,我在下面的方法中尝试做的是交换两个值.'currentBoard'变量是一个不需要编辑的2D数组.'cpy'变量是'currentBoard'的副本,需要更改其变量.'nbt'和'bt'是用于指向2D数组中的索引的1D数组.如果有帮助,函数'copyBoard'的代码总是在下面

我遇到的问题是,当'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 + ", ")));
}
Run Code Online (Sandbox Code Playgroud)

如果它有帮助,那么当代码在标有**的行上时,分配给变量的值


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;
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*n C 6

2D数组是对数组的引用数组.因此,如果您指定returnArray[i] = state[i],则只是returnArray[i]引用引用的相同数组state[i].因此,修改returnArray[i][j]将修改任何东西的第j个元素state[i].您还必须创建"行"的深层副本,例如:

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;
}
Run Code Online (Sandbox Code Playgroud)

看看关于2D阵列的这篇简短的文章,它应该让你更好地了解这里发生了什么.特别是,这个小图像代表int nums[][] = new int[5][4](虽然它在上下文中更有意义):

在此输入图像描述


顺便说一句,你的循环逻辑对我来说有点奇怪; 即使数学恰好在你的情况下运作,这样做更清楚:

for (int i = 0; i < rows; i++)
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

for (int i = 0; i < returnArray.length; i++)
Run Code Online (Sandbox Code Playgroud)

当然,这些假设state.length == rows; 但是你明白了.