复制二维数组 - 仍然使用引用?

时间:2012-04-22 14:59:56

标签: java multidimensional-array copying

我的代码中有(恕我直言)奇怪的行为。我目前正在为Tic Tac Toe游戏实现minimax算法。在我的“后继”方法中,我想确定所有可能的动作。这是代码:

private ArrayList<TicTacToeState[][]> successor(final TicTacToeState[][] field, TicTacToeState s) {
    ArrayList<TicTacToeState[][]> returnList = new ArrayList<TicTacToeState[][]>();
    for (int i = 0; i < TicTacToeGame.FIELDSIZE; i++) {
        for (int j = 0; j < TicTacToeGame.FIELDSIZE; j++) {
            if (field[i][j] == TicTacToeState.Empty) {
                TicTacToeState[][] currentCopy = new TicTacToeState[TicTacToeGame.FIELDSIZE][TicTacToeGame.FIELDSIZE];
                System.arraycopy(field, 0, currentCopy, 0, field.length);
                currentCopy[i][j] = s; // <- field seems to be referenced?!
                returnList.add(currentCopy);
            }
        }
    }
    return returnList;
}

正如你所看到的,我希望得到所有可能的动作并将它们保存到一个arraylist中。不幸的是,当在“currentCopy”中设置值时,“字段”也会改变。但是该字段不应该被修改,因为我复制了数组。哪里出错了?我已经尝试在二维数组上使用clone()方法 - &gt;同样的问题。

感谢您的帮助。

(仅供参考,TicTacToeState是包含“Player1”,“Player2”和“Empty”的枚举)

2 个答案:

答案 0 :(得分:2)

Java使用浅拷贝。也就是说,你得到一份副本,但这不是你想要的。你想要一份深刻的副本。尝试手动将每个元素复制到returnList中,看看会发生什么。

解决此问题的另一种方法是进行移动,递归,然后取消移动。然后你根本不需要复制数组。

答案 1 :(得分:0)

您正在使用二维数组,但只复制系统数组副本中数组的第一个维度。我建议不要复制所有这些。用其他东西来描述可能的动作。另请注意,您不是要复制数组的内容,只复制数组。