Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > работа с деревом |
Автор: ElKa 16.7.2008, 18:26 |
проблема: программа на Java.. дерево состоит из объектов разных классов.. надо обрабатывать узлы не от корня вниз, а в сложном порядке, например сначала узлы 3-го уровня, потом второго, потом предпоследнего и т.д. вопрос: как это лучше реализовать? мои идеи преобразовать дерево в другую структуру, в которой объекты будут в нужном порядке ---> в какую? пробегать дерево несколько раз использовать несколько классов Visitor использовать паттерн Builder ----> не знаю как |
Автор: ivg 16.7.2008, 19:14 | ||
например java.util.PriorityQueue |
Автор: ElKa 16.7.2008, 19:46 |
в 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/ есть. ![]() |
Автор: ElKa 17.7.2008, 16:53 |
PriorityQueue не подходит.. надо что нибудь посложнее.. типа паттерна Строитель |
Автор: Dims 17.7.2008, 19:02 |
По-моему, придётся написать свой класс, в котором синхронно хранилось бы и дерево и Vector<Set<Item>>. |
Автор: ElKa 17.7.2008, 20:04 |
Dims, а Vector зачем? ![]() |
Автор: Dims 18.7.2008, 15:22 |
Дерево будет помнить иерархические отношения, а Вектор -- распределение по слоям. |
Автор: Shurr 18.7.2008, 22:44 | ||
В данном случае вектор играет роль индекса. Т.е. он не хранит никакой уникальной информации, все то же самое можно узнать, пробежавшись по дереву. Но использование такого индекса позволяет получить эту информацию (в данном случае - список узлов на определенном уровне) гораздо быстрее. Судя по описанию из первого сообщения - для подобной обработки придется хранить по вектору (кстати, при однопоточной обработке подойдет и List) на каждый уровень дерева. Подобные вещи подходят в случае, если дерево редко редактируется, а поиск по нему производится часто, при этом скорость обработки критична. В других случаях накладные расходы на организацию и поддержание в актуальном состоянии такого индекса могут не оправдаться полученными выгодами. Тогда возможно стоит организовать доступ через обычный Walker. При этом для удобства его интерфейс можно сделать похожим на интерфейс списка (так, например, под интерфейс org.w3c.dom.NodeList обычно подкладывается имплементация в виде walker'a). |
Автор: ElKa 19.7.2008, 01:46 |
дерево будет использоваться один раз для генерации кода никаких поисков по нему не будет ![]() |