| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > получение всех путей из tree |
| Автор: hagerds 18.3.2012, 13:59 | ||
| всем добрый день! создал Дерево JTree в него добавляю и удаляю папки и файлы. примерно как в Хормстране тома 2 глава 6. пример:
Крень/ /Папка_1/Папка_1.1/x /Папка_1/Папка_1.1/y /Папка_1/f /Папка_2/i /Папка_2/j /k БД: файл | путь x | y | f | Как лучше или правильней будет сохранить это дерево (для дольнейшего востановыления его при очередном запуске проги)? моё предположение =) 1)получить список всех путей и сохранить каждый путь в свою строку с именем столбца "путь" БД. или 2)сохранить в столбец "путь" БД последние узлы в которых лежат файлы. а корнь и остольне узлы мы сохраним в файл как Корень/Папка_1/Папка_1.1 Корень/Папка_1 Корень/Папка_2 Корень/ при считывании очередной строки из файла мы сортируем базу по последнему узлу и добовляем в него все листы найденные после сортировки. Как получить пути всех листов /Папка_1/Папка_1.1/x, /Папка_1/Папка_1.1/y ...и т.д? |
| Автор: Cheloveck 18.3.2012, 14:04 | ||
| Обычно хранят список узлов и у каждого есть родитель, кроме корня. Корни ты можешь сохранить в отдельной таблице, а ветки дёргать по одной. Для сокращения количества запросов нужно добавить поле root в первую таблицу, тогда останится только лишь восстановить иерархию. Добавлено через 9 минут и 19 секунд
Как-то так, навскидку. Но тут есть простор для оптимизации. Можно даже одной таблицей обойтись попробовать. |
| Автор: javafreshglow 18.3.2012, 16:11 | ||||||||||||||||||
Добрый день. Вы спрашивали о сохранении дерева и в БД :
- мне не понятно где Вы хотите хранить. Относительно хранения в файле вероятно можно хранить в xml или json. Но если хранить в базе, я использую БД - Oracle, можно использовать следующую конструкцию, воспользовавшись возможностями БД: Создадим таблицу:
Добавим указатель на родительский узел ("иерархию") :
Добавим элементы:
Проверим, что получилось, используя возможности Oracle - SYS_CONNECT_BY_PATH, для получения пути:
Получилось следующее:
Поскольку вопрос по Java, я далее создаю объектные классы и маппинг для классов. Я использую EclipseLink. Часть маппинга, для примера покажу только класс StoreTree, в xml представлении:
Класс TreePath - не привожу. Т.е. для получения пути - получаем список классов TreePath/ Для построения дерева, получаем корень дерева - класс StoreTree и последовательно получая его дочерние элемнеты - строим дерево. Также подключив кэш (например, http://ehcache.org) можно добиться некоторой скорости работы. Узлы деревьев насчитывали до 10 тысяч узлов. Я ответил на Ваш вопрос? |
| Автор: Cheloveck 18.3.2012, 16:37 |
| javafreshglow, оформи код тегом code, пожалуйста |
| Автор: hagerds 23.4.2012, 21:41 |
| спасибо всем за ответы. но у меня не совсем получается сделать!!!! javafreshglow очень хорошо объяснил, но на оракле. я работаю с MySql. там таких команд нет. пытаюсь сделать следующее!!! после добавления узлов и листов на фрэйм в JTree у меня получается красивая иерархия начал проходить рекурсией и возникли проблемы. как получить имена всего списока и их позиции? |
| Автор: hagerds 25.4.2012, 15:26 |
| TreePath root= jTree.getClosestPathForLocation(0, 0); вот так получаю корень. Как получить все вложенные элементы в root или их число, что бу пройтись циклом или итератором? |
| Автор: hagerds 25.4.2012, 15:47 |
| DefaultMutableTreeNode root= (DefaultMutableTreeNode) jTree.getModel().getRoot() ; int numberChildrens= world.getChildCount(); Всем спасибо! |
| Автор: hagerds 28.4.2012, 20:14 |
| всем спасибо |