Сериализация дерева и сохранение в RandomAccessFile - PullRequest
1 голос
/ 12 марта 2012

У меня есть задание, в котором у меня есть дерево, где все родительские узлы содержат вопросы «да» или «нет», а конечные узлы содержат ответ.В каждом родительском узле есть два дочерних узла: узел да и узел нет.Это дерево должно быть сериализовано и сохранено в файле через RandomAccessFile, чтобы дерево не записывалось в файл каждый раз.Если конечный узел не содержит ответ, который ищет пользователь, пользователь отправляет новый ответ и вопрос, чтобы провести различие между ответом листа и ответом, о котором он думал.Затем этот лист становится родителем со своим собственным вопросом и двумя дочерними узлами: узлом «да» и узлом «нет» (эти два узла являются новыми листами).Этот процесс вызывает у меня проблемы, потому что, если лист уже записан в файл, как я могу перезаписать лист, не проливая на данные другого узла (так как размер байта узла листа изменяется, когда он становится родительским).Обратите внимание, что программа может быть убита в любое время, и ее древовидная структура должна оставаться неизменной.Спасибо

1 Ответ

3 голосов
/ 12 марта 2012

с записью процесса в файл, имея в виду, что процесс может быть завершен в любое время ... -> ведение журнала

размер байта узла изменяется, когда он становится родительским? посмотрим ...

у родительского узла есть вопрос (ссылка на строку)
родительский узел имеет узел да (ссылка на узел)
родительский узел не имеет узла (ссылка на узел)

листовой узел имеет ответ (ссылка на строку)
конечный узел может иметь 2 неиспользуемых ссылки на другие узлы ...

поэтому у узла есть строковая ссылка и 2 ссылки на узлы ...

если обе ссылки на узлы имеют значение NULL, это конечный узел, а строка ref является ответом ... иначе это родительский узел, а строка ref является вопросом ...

при сериализации в файл:

вы знаете, что узел имеет фиксированную длину: 3 указателя (ссылки)
поэтому ваша новая строковая ссылка будет иметь текущую позицию + 3 длины указателя
запишите этот адрес как строку ref ...
написать 2 пустые ссылки на данный момент ... (мы пока не знаем, где будут записаны эти узлы)
напишите строку

Обходите ваше дерево и помните, что вам нужно обновить пропущенные 2 ссылки на узлы, когда вы знаете положение узла в вашем файле ...

при обновлении узла (лист становится родительским):

записать новую строку вопроса в файл и сохранить ее адрес
сохранить адрес текущей строки ответа ...
заменить строковую ссылку в старом узле новым адресом строки вопроса
написать новый узел для старого ответа (строка ref является сохраненным адресом для текущего ответа) и обновить один из старых узлов - ссылки на узлы (соответственно да или нет)
написать новый узел для другого ответа (строковая ссылка может быть сохранена через 3 указателя, поэтому адрес известен)
напишите новую строку ответа
обновить старые узлы, ссылка на другой узел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...