我正在开发一款游戏,我需要为我的AI创建换位表。我实施了Hashtable
,以便Hashtable的key
是一个正在考虑的状态,其相应的value
是最佳的下一步行动。
但是,当我将Hashtable保存在Android的内部存储中并在下次恢复时,它似乎有一些已保存的数据,但keys
(即游戏状态)与keys
我不同已保存在上一个实例中。
以下是我保存和恢复数据的方法:
private void readTranspositionTableFromFile() {
FileInputStream fis = openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
transpositionTable = (Hashtable<BoardState, NextMove>) ois.readObject();
ois.close();
deleteFile(FILENAME);
}
private void writeTranspositionTableToFile() {
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(transpositionTable);
oos.close();
}
我在hashCode()
实现中看到没有问题,因为它一遍又一遍地为相同的状态返回相同的值。
我怀疑保存/恢复转置表会弄乱我的数据,因为我记录了2个运行时,并且在第一个运行时我得到hashCode()
以返回3964和3029表示要添加到表中的2个状态。但是,从文件中读取表时,hashCode()
两次返回9119。
保存/恢复数据有什么问题吗?
答案 0 :(得分:0)
我的序列化和散列完全没问题。我的程序是这样的:
transpositionTable
transpositionTable
保存到内部存储空间然而,经过细致的记录后,我发现我的transpositionTable
在步骤2之后发生了变化。这是因为在步骤1)中,我使用了
BoardState newKey = currentData.getBoardState();
并将其保存到我的transpositionTable
。然后在步骤2)中,当我的currentData
发生变化时,我的transpositionTable
也相应地发生了变化。我尝试使用
BoardState newKey = currentData.getBoardState().clone();
但这也不起作用。最后,我必须手动将currentData.getBoardState()
的每个字段分配给newKey
,这有效。