繁体   English   中英

Java在2D数组中更改值

[英]Java changing values in a 2D array

我正在使用2D数组,在以下方法中尝试执行的操作是交换两个值。 “ currentBoard”变量是一个2D数组,不应编辑该数组。 “ cpy”变量是“ currentBoard”的副本,需要更改其变量。 'nbt'和'bt'是一维数组,用于指向2D数组中的索引。 如果有帮助,函数“ 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 + ", ")));
}

如果这有帮助,那么在代码位于标有**的行上时,分配给变量的值会有所帮助


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;
}

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;
}

查看有关2D数组的简短文章 ,它应该使您对这里发生的事情有一个更好的了解。 特别是,这个小图像代表int nums[][] = new int[5][4] (尽管在上下文中更有意义):

在此处输入图片说明


顺便说一下,您的循环逻辑对我来说有点奇怪; 即使在您遇到的情况下数学运算成功,也可以这样做:

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

或更笼统地说:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM