Java更改2D数组中的值

时间:2014-04-14 04:18:15

标签: java arrays multidimensional-array

我正在使用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;
}

1 个答案:

答案 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](虽然它在上下文中更有意义):

enter image description here


顺便说一下,你的循环逻辑对我来说有点奇怪;即使数学在你的情况下发生了变化,也可以更清楚地做到这一点:

for (int i = 0; i < rows; i++)

或更一般地说:

for (int i = 0; i < returnArray.length; i++)

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