在Android内部保存数据会弄乱我的数据



我目前正在开发一个游戏,我需要为我的AI创建一个换位表。我实现了Hashtable,以便对 Hashtable 的key是一个正在考虑的状态,其相应的value是最佳的下一步行动。

但是,当我将哈希表保存在 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。

保存/恢复数据有任何问题吗?

我的序列化和哈希完全没问题。我的程序是这样的:

  1. transpositionTable添加新的键值对
  2. 玩下一步
  3. transpositionTable保存到内部存储

但是,经过细致的记录,我发现我的transpositionTable在步骤 2( 之后发生了变化(。这是因为在步骤 1( 中,我使用了

BoardState newKey = currentData.getBoardState();

并将其保存到我的transpositionTable.然后在步骤 2( 中,当我的currentData发生变化时,我的transpositionTable也相应更改。我试过使用

BoardState newKey = currentData.getBoardState().clone();

但这也没有用。最后,我必须手动将每个currentData.getBoardState()字段分配给newKey,这很有效。

最新更新