Внутреннее сохранение данных в Android портит мои данные

В настоящее время я работаю над игрой, где мне нужно создать таблицу транспонирования для моего ИИ. Я реализовал Hashtable таким образом key Hashtable - это рассматриваемое состояние и его 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 для двух состояний, которые должны были быть добавлены в таблицу. Однако, читая таблицу из файла, hashCode() вернулся 9119 дважды.

Есть ли проблема в сохранении / восстановлении данных?

1 ответ

Решение

Мои сериализации и хэширования были полностью в порядке. Моя программа пошла примерно так:

  1. добавить новую пару ключ-значение в transpositionTable
  2. играть следующим ходом
  3. спасти transpositionTable на внутреннюю память

Однако после тщательной регистрации я обнаружил, что мой transpositionTable изменилось после шага 2). Это было потому, что во время шага 1) я использовал

BoardState newKey = currentData.getBoardState();

и сохранил его в мой transpositionTable, Затем в шаге 2), когда мой currentData изменилось, мой transpositionTable изменилось соответственно. Я пытался с помощью

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

но это тоже не сработало. Наконец я должен был назначить каждое поле currentData.getBoardState() в newKey вручную, который работал.

Другие вопросы по тегам