Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > работа с деревом


Автор: ElKa 16.7.2008, 18:26
проблема: программа на Java.. дерево состоит из объектов разных классов.. 
надо обрабатывать узлы не от корня вниз, а в сложном порядке, 
например сначала узлы 3-го уровня, потом второго, потом предпоследнего и т.д.

вопрос: как это лучше реализовать?

мои идеи
преобразовать дерево в другую структуру, в которой объекты будут в нужном порядке  ---> в какую?

пробегать дерево несколько раз

использовать несколько классов Visitor

использовать паттерн Builder ----> не знаю как 


Автор: ivg 16.7.2008, 19:14
Цитата(ElKa @  16.7.2008,  21:26 Найти цитируемый пост)
преобразовать дерево в другую структуру, в которой объекты будут в нужном порядке  ---> в какую?

например java.util.PriorityQueue

Автор: ElKa 16.7.2008, 19:46
Цитата(ivg @  16.7.2008,  19:14 Найти цитируемый пост)
например java.util.PriorityQueue 


в http://java.sun.com/j2se/1.4.2/docs/api/ такого класса нет 


http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html

Автор: ivg 16.7.2008, 19:52
А http://java.sun.com/j2se/1.5.0/docs/api/ есть.  smile 

Автор: ElKa 17.7.2008, 16:53
PriorityQueue не подходит.. надо что нибудь посложнее.. типа паттерна Строитель

Автор: Dims 17.7.2008, 19:02
По-моему, придётся написать свой класс, в котором синхронно хранилось бы и дерево и Vector<Set<Item>>.

Автор: ElKa 17.7.2008, 20:04
Dims

а Vector зачем?  smile 

Автор: Dims 18.7.2008, 15:22
Цитата(ElKa @  17.7.2008,  20:04 Найти цитируемый пост)
а Vector зачем?

Дерево будет помнить иерархические отношения, а Вектор -- распределение по слоям.

Автор: Shurr 18.7.2008, 22:44
Цитата(ElKa @ 17.7.2008,  19:04)
а Vector зачем?  smile

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

Подобные вещи подходят в случае, если дерево редко редактируется, а поиск по нему производится часто, при этом скорость обработки критична. В других случаях накладные расходы на организацию и поддержание в актуальном состоянии такого индекса могут не оправдаться полученными выгодами. 

Тогда возможно стоит организовать доступ через обычный Walker. При этом для удобства его интерфейс можно сделать похожим на интерфейс списка (так, например, под интерфейс org.w3c.dom.NodeList обычно подкладывается имплементация в виде walker'a).

Автор: ElKa 19.7.2008, 01:46
дерево будет использоваться один раз для генерации кода
никаких поисков по нему не будет  smile 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)