gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:50:44 24 4
gpt4 key购买 nike

我的代码中出现了(恕我直言)奇怪的行为。我目前正在为 Tic Tac Toe 游戏实现极小极大算法。在我的“后继”方法中,我想确定所有可能的 Action 。代码如下:

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

正如你所看到的,我想获取所有可能的移动并将它们保存到数组列表中。不幸的是,当在“currentCopy”中设置值时,“字段”也发生了变化。但不应引用该字段,因为我复制了该数组。错误在哪里?我已经尝试过在二维数组上使用clone()方法->同样的问题。

感谢您的帮助。

(仅供引用,TicTacToeState 是一个枚举,包括“Player1”、“Player2”和“Empty”)

最佳答案

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

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

关于java - 复制二维数组 - 仍然使用引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com