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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> получение всех путей из tree 
V
    Опции темы
hagerds
Дата 18.3.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всем добрый день!
создал Дерево JTree в него добавляю и удаляю папки и файлы. примерно как в Хормстране тома 2 глава 6.

пример:
Код

private JTree jTree2;
private DefaultTreeModel model;
...
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Корень");
DefaultMutableTreeNode papka_1 = new DefaultMutableTreeNode("Папка_1");
root.add(papka_1);
DefaultMutableTreeNode papka_1.1= new DefaultMutableTreeNode("Папка_1.1");
      papka_1.add(papka_1.1);
DefaultMutableTreeNode f = new DefaultMutableTreeNode("f");
      papka_1.add(f);
DefaultMutableTreeNode x = new DefaultMutableTreeNode("x");
      papka_1.1.add(x);
DefaultMutableTreeNode y = new DefaultMutableTreeNode("y");
      papka_1.1.add(y);

DefaultMutableTreeNode papka_2 = new DefaultMutableTreeNode("Папка_2");
root.add(papka_2);
DefaultMutableTreeNode i = new DefaultMutableTreeNode("i");
papka_2.add(i);
DefaultMutableTreeNode j = new DefaultMutableTreeNode("j");
papka_2.add(j);

DefaultMutableTreeNode k = new DefaultMutableTreeNode("k");
root.add(k);

TreeNode r = root;
model = new DefaultTreeModel(r);
jTree2 = new JTree(model);
...

Крень/
         /Папка_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 ...и т.д?
PM MAIL   Вверх
Cheloveck
Дата 18.3.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



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

Добавлено через 9 минут и 19 секунд
Код

create table [Roots] (
    [Id] bigint primary key,
    [Name] nvarchar(256)
);

create table [Items] (
    [Id] bigint primary key,
    [Name] nvarchar(256) not null,
    [Parent] bigint,
    [Root] bigint not null constraint [FK_ItemsRoot] references [Roots]([Id])
);

Как-то так, навскидку. Но тут есть простор для оптимизации. Можно даже одной таблицей обойтись попробовать.


--------------------
user posted image
PM Jabber   Вверх
javafreshglow
Дата 18.3.2012, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(hagerds @ 18.3.2012,  13:59)
...
Как лучше или правильней будет сохранить это дерево (для дольнейшего востановыления его при очередном запуске проги)? 
моё предположение =)
1)получить список всех путей и сохранить каждый путь в свою строку с именем столбца "путь" БД.
или
2)сохранить в столбец "путь" БД последние узлы в которых лежат файлы. а корнь и остольне узлы мы сохраним в файл как 
Корень/Папка_1/Папка_1.1
Корень/Папка_1
Корень/Папка_2
Корень/
при считывании очередной строки из файла мы сортируем базу по последнему узлу и добовляем в него все листы найденные после сортировки.

Как получить пути всех листов /Папка_1/Папка_1.1/x, /Папка_1/Папка_1.1/y ...и т.д?

Добрый день.

Вы спрашивали о сохранении дерева и в БД : 
Цитата
 2)сохранить в столбец "путь" БД последние узлы в которых лежат файлы. 
, но также упоминали о хранении в файле: 
Цитата
 а корнь и остольне узлы мы сохраним в файл 

 - мне не понятно где Вы хотите хранить.

Относительно хранения в файле  вероятно можно хранить в xml или json.
Но если хранить в базе, я использую БД - Oracle, можно использовать следующую конструкцию, воспользовавшись возможностями БД:
Создадим таблицу:
Код

CREATE TABLE STORETREE
(
  CODETREE       NUMBER NOT NULL primary key,
  CODEPARENTTREE NUMBER,
  TREENODE     VARCHAR2(512 BYTE) NOT NULL
);


Добавим указатель на родительский узел ("иерархию") :
Код

alter table STORETREE
add CONSTRAINT REFTOPARENT
FOREIGN KEY (CODEPARENTTREE)
REFERENCES STORETREE (CODETREE);


Добавим элементы:
Код

INSERT INTO STORETREE VALUES(1, NULL, 'PARENT1');
INSERT INTO STORETREE VALUES(2, 1, 'CHILD1');
INSERT INTO STORETREE VALUES(3, 1, 'CHILD2');
INSERT INTO STORETREE VALUES(4, 2, 'CHILD3');
INSERT INTO STORETREE VALUES(5, 3, 'CHILD4');
INSERT INTO STORETREE VALUES(6, 4, 'CHILD5');
INSERT INTO STORETREE VALUES(7, 4, 'CHILD6');


Проверим, что получилось, используя возможности Oracle - SYS_CONNECT_BY_PATH, для получения пути:
Код

select SYS_CONNECT_BY_PATH(TREENODE, '/') "Path" from STORETREE 
start with CODEPARENTTREE is null
connect by prior CODETREE = CODEPARENTTREE;


Получилось следующее:
Код

/PARENT1
/PARENT1/CHILD1
/PARENT1/CHILD1/CHILD3
/PARENT1/CHILD1/CHILD3/CHILD5
/PARENT1/CHILD1/CHILD3/CHILD6
/PARENT1/CHILD2
/PARENT1/CHILD2/CHILD4


Поскольку вопрос по Java, я далее создаю объектные классы и маппинг для классов. Я использую EclipseLink. Часть маппинга, для примера покажу только класс StoreTree, в xml представлении:
Код

<?xml version="1.0" encoding="UTF-8"?>
<!-- EJB 3.0 XML Mapping File -->
<!-- Author: JavaFreshGlow -->
<!-- Modified: 18 03 2012 г. 16:17:37 -->
<entity-mappings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/orm" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.eclipse.org/eclipselink/xsds/persistence/orm [URL=http://www.eclipse.org/eclipselink/xsds/eclipselink_orm_2_1.xsd&quot;]http://www.eclipse.org/eclipselink/xsds/ec...1.xsd"[/URL]
  version="2.1">
   <persistence-unit-metadata>
      <persistence-unit-defaults>
         <access>FIELD</access>
      </persistence-unit-defaults>
   </persistence-unit-metadata>
   <access>FIELD</access>
   <entity class="package.StoreTree" access="FIELD" metadata-complete="true">
      <description>Generated class mapping for Tree</description>
      <table name="STORETREE"/>
      <sequence-generator name="SEQTREE" sequence-name="SEQTREE" allocation-size="1"/>
      <named-native-query name="findTreePath" result-class="package.TreePath">
        <query>
  select SYS_CONNECT_BY_PATH(TREENODE, '/') "Path" from STORETREE 
  start with CODEPARENTTREE is null
  connect by prior CODETREE = CODEPARENTTREE;
        </query>
      </named-native-query>
      <attributes>
         <id name="codeTree">
            <column name="CODETREE" nullable="false" insertable="true" updatable="true"/>
            <generated-value strategy="SEQUENCE" generator="SEQTREE"/>
         </id>
         <basic name="treeNode" optional="false">
            <column name="TREENODE" nullable="false" insertable="true" updatable="true" length="512"/>
         </basic>
         <many-to-one name="parentTree">
            <join-column name="CODEPARENTTREE" referenced-column-name="CODETREE" nullable="true"/>
         </many-to-one>
      </attributes>
   </entity>
</entity-mappings>


Класс TreePath - не привожу.
Т.е. для получения пути - получаем список классов TreePath/
Для построения дерева, получаем корень дерева - класс StoreTree и последовательно получая его дочерние элемнеты - строим дерево.
Также подключив кэш (например, http://ehcache.org) можно добиться некоторой скорости работы.
Узлы деревьев насчитывали до 10 тысяч узлов.

Я ответил на Ваш вопрос?

Это сообщение отредактировал(а) javafreshglow - 18.3.2012, 16:55
PM MAIL   Вверх
Cheloveck
Дата 18.3.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



javafreshglow, оформи код тегом code, пожалуйста


--------------------
user posted image
PM Jabber   Вверх
hagerds
Дата 23.4.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо всем за ответы. но у меня не совсем получается сделать!!!!
javafreshglow очень хорошо объяснил, но на оракле. я работаю с MySql. там таких команд нет. 

пытаюсь сделать следующее!!! после добавления узлов и листов на фрэйм в JTree у меня получается красивая иерархия smile  smile  smile, которую по нажатию на фолшебную клавишу сохранить. Я ДОЛЖЕН. сохранить в БД весь список иерархии JTree.

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

 smile  smile  smile 
PM MAIL   Вверх
hagerds
Дата 25.4.2012, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



TreePath root= jTree.getClosestPathForLocation(0, 0);
вот так получаю корень.

Как получить все вложенные элементы в root или их число, что бу пройтись циклом или итератором?

PM MAIL   Вверх
hagerds
Дата 25.4.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



DefaultMutableTreeNode root= (DefaultMutableTreeNode) jTree.getModel().getRoot() ;
int numberChildrens= world.getChildCount();

Всем спасибо!
PM MAIL   Вверх
hagerds
Дата 28.4.2012, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всем спасибо smile  smile  smile 

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

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

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


 




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


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

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