Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой контейнер для Jtree выбрать!? 
:(
    Опции темы
freshAngel
  Дата 23.3.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Привет.
Необходимо построить дерево типа:
[-] Root
    [-] Категория 1
            [-] Категория 1.1
                  [-] Категория 1.1.1
                           [-] Категория 1.1.1.1

В каком контейнере лучше хранить информацию для построения данного дерева!?
 smile 

PM MAIL   Вверх
jk1
Дата 23.3.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Можно использовать для хранения саму структуру узлов дерева, то есть хранить ссылку на root. Очень удобно наличием методов обхода в ширину и в глубину любого поддерева.
Код

public class InputWindow {
    InputWindow() {
        JFrame frame = new JFrame();
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        DefaultMutableTreeNode cat1 = new DefaultMutableTreeNode("Категория 1");
        DefaultMutableTreeNode cat2 = new DefaultMutableTreeNode("Категория 1.1");
        DefaultMutableTreeNode cat3 = new DefaultMutableTreeNode("Категория 1.1.1");
        root.add(cat1);
        cat1.add(cat2);
        cat2.add(cat3);
        frame.getContentPane().add(new JScrollPane(new JTree(root)));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new InputWindow();
    }
}




--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
freshAngel
  Дата 25.3.2010, 05:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Хранить ссылку на root?
Я хотел воспользоваться контейнером по причине того, что после вывода дерева его структура будет меняться (будут добавляться, изменяться, удаляться узлы).
Поэтому, например при добавлении узлов, что-бы проверить есть узел с таким-же названием или нет удобнее воспользоваться контейнером чем обходить дерево.

PM MAIL   Вверх
jk1
Дата 25.3.2010, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Цитата

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

Что касается удобства, то в обоих случаях вам дадут итератор, разницы никакой. 

Единственное что можно выиграть на контейнере - производительность при поиске. Контейнер выбирается под конкретную задачу: если требуется проверить существование в дереве объекта с полем name=="Вася", тогда складывайте объеткы дополнительно в Set, а в методе equals укажите сравнение по этому полю.

Вывод: хотите оптимизации, указывайте требования. Наример: "нужен поиск по трем строковым полям за О(n)".


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
freshAngel
  Дата 26.3.2010, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 1.10.2008

Репутация: нет
Всего: нет



Производительность в данном случае не важна.
А как потом обойти дерево!?
PM MAIL   Вверх
jk1
Дата 26.3.2010, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Если необходимо выполнить обход дерева в глубину, то
Код

 Enumeration e = root.depthFirstEnumeration();

если нужен обход в ширину, то
Код

 Enumeration e = root.breadthFirstEnumeration();

а дальше итерируемся по полученному Enumeration:
Код

 while (e.hasMoreElements()){
           DefaultMutableTreeNode next = (DefaultMutableTreeNode) e.nextElement();
        }



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Deo
  Дата 26.3.2010, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.3.2010

Репутация: нет
Всего: нет



Привет.
А кто может подсказать такое.
Есть первый цикл в котором определяются главные ветки дерева (родители):
Код

while (...) {
top.add(new DefaultMutableTreeNode("1");
} // while


Потом второй цикл, в котором нужно к родителю прикрепить детей. (типа 1.1 к 1)
Код

while (...) {
// А как  сдесь прикрепить к вышестоящему родителю? (типа 1.1.1 к 1.1)
} // while


И третий цикл, в котором нужно прикрепить новые ноды к предыдущему родителю! (типа 1.1.1.1 к 1.1.1)

Это сообщение отредактировал(а) Deo - 26.3.2010, 09:33
PM MAIL   Вверх
jk1
Дата 26.3.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 21
Всего: 75



Самым оптимальным решением будет вложить циклы друг в друга.

Код

       DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        for (int i = 0; i <= 5; i++) {
            DefaultMutableTreeNode lev1 = new DefaultMutableTreeNode(i);
            for (int j = 0; j <= 5; j++) {
                DefaultMutableTreeNode lev2 = new DefaultMutableTreeNode(i+"."+j);
                for (int k = 0; k <= 5; k++) {
                   lev2.add(new DefaultMutableTreeNode(i+"."+j+"."+k));
                }
                lev1.add(lev2);
            }
            root.add(lev1);
        }


Это сообщение отредактировал(а) jk1 - 26.3.2010, 09:49


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Deo
Дата 26.3.2010, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.3.2010

Репутация: нет
Всего: нет



Цитата(jk1 @ 26.3.2010,  09:44)
Самым оптимальным решением будет вложить циклы друг в друга.

Спасибо за совет.
У меня сейчас все работает на перезаписи ветки нодов:
Ветка 1
    Добавляем ветку 2


Потом ведущей становится ветка 2 и по технологии:
Ветка 2
     Добавляем ветку 3

и т.д.

Попробую Ваш способ.

Это сообщение отредактировал(а) Deo - 26.3.2010, 09:49
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.