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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создать дерево из set 
V
    Опции темы
Samotnik
Дата 23.11.2010, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



привет. Сразу скажу, что java.util.TreeSet<E> тут не причем smile 
Стоит задача, сформировать дерево такого вида : 
user posted image
Чтобы потом можно было проходить по узлам, в виде такого алгоритма : Первый узел, у тебя есть дочерний Sport, Sport у тебя есть men ?

Может есть какие-нибудь примеры такого дерева на Java  smile 
PM MAIL   Вверх
Skipy
Дата 23.11.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



А в чем проблема? 


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Samotnik
Дата 23.11.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Skipy @  23.11.2010,  12:13 Найти цитируемый пост)
А в чем проблема?  

как это сделать ? smile
PM MAIL   Вверх
Samotnik
Дата 23.11.2010, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



ну народ, ведь наверняка кто-то деревья на java писал smile  smile 
PM MAIL   Вверх
Temdegon
Дата 23.11.2010, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А в чем проблема?  

+1
Ну сделать класс TreeElement с полями 
TreeElement parent
List<TreeElement>children
ну и методы hasChild(TreeElement)
addChild(TreeElement)
etc
или проблема в чем-то другом?
Или проблема заполнить такое дерево из коллекции?

Это сообщение отредактировал(а) Temdegon - 23.11.2010, 22:30
PM MAIL   Вверх
Samotnik
Дата 23.11.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Temdegon, спасибо, а как мне это применить к той "диаграмме" что я в первом посту привел ? 
PM MAIL   Вверх
Temdegon
Дата 23.11.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Объясни плиз подробно, что тебе надо сделать. Ну ведь явно не нарисовать такую милую картиночку из первого поста? Тебе надо заполнить модель какого-то дерева какими-то данными? или тебе надо эту самую модель дерева сначала сделать? Из каких даных тебе надо сделать древовидную структуру?

Добавлено через 14 минут и 24 секунды
Заполнить дерево проще всего рекурсивной функцией. Примерно так:
Код

RootNode = getRootNode(); // нашли корневой элемент
fillChildren(RootNode); //вызвали метод, заполняющий его дочерними элементами

void fillChildren(Node node) {
 List<Node> nodesList = getNodesByParent(node); // находишь все дочерние элементы
 for (Node current : nodesList) { 
  node.addChild(current); // добавляешь каждый элемент в текущий
  fillChildren(current); // заполняешь дочерними элементами каждый элемент
 }
}


Надеюсь, смысл понятен
PM MAIL   Вверх
Samotnik
Дата 24.11.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Temdegon @  23.11.2010,  22:36 Найти цитируемый пост)
Объясни плиз подробно, что тебе надо сделать.

мне будет приходить xml, в котором выстроена уже готовая модель отношений родителей и детей. Пример :
Код

<?xml version="1.0"?>
<categories>
    <category name="sport">
        <category name="women">
            <category name="tennis"/>
        </category>
        <category name="men">
            <category name="boys">
                <category name="football"/>
            </category>
        </category>
    </category>
    <category name="art">
        <category name="films"/>
        <category name="books"/>
        <category name="music"/>
    </category>
</categories>

Мне необходимо распарсить этот xml и сделать из него дерево (с точно такими же связями) на Java. Т.е. дерево должно состоять просто из String значений. 
PM MAIL   Вверх
Temdegon
Дата 24.11.2010, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Какими средствами распарсить xml я не подскажу, т.к. почти не приходилось с ним работаь. Но думаю сложного ничего в этом нет.
Возьми готовую реализацюи элемента дерева 
http://download.oracle.com/javase/1.4.2/do...leTreeNode.html
или напиши свою.
Ну а дальше какие проблемы? Создай корневой элемент и рекурсивно вглубь добавляй дочерние элементы.
PM MAIL   Вверх
Samotnik
Дата 24.11.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Temdegon, распарсить xml я могу, я про это и не спрашиваю smile
я про то, как хранить и в чем. smile 
PM MAIL   Вверх
Temdegon
Дата 24.11.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну прям стригни связать деревцем неполучится никак. Полюбому нужно их заворачивать в класс, который будет содержать ссылки на вложенные элементы. 
или юзай 
http://download.oracle.com/javase/1.4.2/do...leTreeNode.html
или как я уже писал
Цитата

Ну сделать класс TreeElement с полями 
TreeElement parent
List<TreeElement>children
ну и методы hasChild(TreeElement)
addChild(TreeElement)
etc

только, естественно, в этом классе должно быть поле для хранения твоего стринга.
Чего тебе не хвататет? Сохранения такой структуры? 
PM MAIL   Вверх
Samotnik
Дата 24.11.2010, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Temdegon, хорошо, спасибо, понял. 
А что если мне нужно будет помечать каждый элемент моего дерева, к чему он относится, то это как сделать ? 
Например, sport - отнести к sport, его дочерний элемент women отнести тоже к sport, и в свою очередь дочерний элемент tenis отнести к games
PM MAIL   Вверх
Temdegon
Дата 24.11.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если я правильно понял вопрос, добавь в свой TreeElement дополнительное поле - category и выставляй его. Типа Enum какой-нить или какого-нить своего класса.
Кстати, такая древовидная структура прекрасно мапится хибернейтом и каскадно загружается. тянешь из базы корневой элемент, и хибер сам загрузит всю сруктуру.
PM MAIL   Вверх
Samotnik
Дата 24.11.2010, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Цитата(Temdegon @  24.11.2010,  15:42 Найти цитируемый пост)
Если я правильно понял вопрос, добавь в свой TreeElement дополнительное поле - category и выставляй его.

а просто 
Код

String category;

нельзя ?
PM MAIL   Вверх
Temdegon
Дата 24.11.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Почему нелья? можно конечно. только как-то это не кошерно IMHO. Чем тебе не нравится сделать класс Caterogy с полем string categoryName, создать экземпляры для нужных  категорий и тыкать ссылки на них в элементы дерева? Ну хотя дело твое, работать-то будет.
PM MAIL   Вверх
Samotnik
Дата 24.11.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



а вот это случайно не то что мне и нужно ? 
Ты про примерно такую реализацию мне говоришь ? smile 
PM MAIL   Вверх
Temdegon
Дата 24.11.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



да, такая.
почитай на вики про ДЕРЕВО
лишним не будет
PM MAIL   Вверх
Samotnik
Дата 2.12.2010, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



сегодня продолжил. 
Не понимаю, как использовать этот класс ? Как создать объект parent класса TreeElement  из обычного String - Sport  ?
И еще вопрос. Что значит parent ? это только самый верхний первый элемент ? 
 smile 
PM MAIL   Вверх
nc30
Дата 2.12.2010, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Интересующийся :)
*


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

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



Samotnik, вроде бы есть готовые решения по деревьям, которые здесь уже обсуждались... 

Хотя вы это скорее всего уже видели, и я напрасно влезаю в обсуждение  smile 
PM MAIL   Вверх
Temdegon
Дата 3.12.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



поле parent тебе не обязательно. это ссылка на родительский элемент.
String - Sport - это просто дополнительное поле в классе TreeElement.
В общем, на примере javax.swing.tree.DefaultMutableTreeNode

Код

        DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
    DefaultMutableTreeNode sport = new DefaultMutableTreeNode("Sport");
    DefaultMutableTreeNode video = new DefaultMutableTreeNode("Video");
    DefaultMutableTreeNode art = new DefaultMutableTreeNode("Art");
    DefaultMutableTreeNode men = new DefaultMutableTreeNode("Men");
    DefaultMutableTreeNode women = new DefaultMutableTreeNode("Women");
    root.add(sport);
    root.add(video);
    root.add(art);
    sport.add(men);
    sport.add(women);
    // как добавить остальные думаю понятно

Если нужен какой-то дополнительный функционал - расширяй этот класс, или implements MutableTreeNode;

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


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

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



Сделал вот так. Вроде все так как и надо. Хочу критики  smile 
Код

package com.de.treeView;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class CategoryCompatibility {
    
    private static final Log logger = LogFactory.getLog(CategoryCompatibility.class);
    
    public static class Tree {
         
        private NodeTree rootElement;
         
        public Tree() {
            super();
        }
     
        public NodeTree getRootElement() {
            return this.rootElement;
        }
     
        public void setRootElement(NodeTree rootElement) {
            this.rootElement = rootElement;
        }
         
        public List<NodeTree> toList() {
            List<NodeTree> list = new ArrayList<NodeTree>();
            walk(rootElement, list);
            return list;
        }
         
        public String toString() {
            return toList().toString();
        }
         
        private void walk(NodeTree element, List<NodeTree> list) {
            list.add(element);
            for (NodeTree data : element.getChildren()) {
                walk(data, list);
            }
        }
    }

    public static class NodeTree {
     
        private String data;
        private List<NodeTree> children;
        private String reference;

        public NodeTree() {
            super();
        }
     
        public NodeTree(String data) {
            this();
            setData(data);
        }
        
        public NodeTree(String data, String reference) {
            this();
            setData(data);
            setReference(reference);
        }
         
        public List<NodeTree> getChildren() {
            if (this.children == null) {
                return new ArrayList<NodeTree>();
            }
            return this.children;
        }
     
        public void setChildren(List<NodeTree> children) {
            this.children = children;
        }
     
        public int getNumberOfChildren() {
            if (children == null) {
                return 0;
            }
            return children.size();
        }
         
        public void addChild(NodeTree child) {
            if (children == null) {
                children = new ArrayList<NodeTree>();
            }
            children.add(child);
        }
         
        public void insertChildAt(int index, NodeTree child) throws IndexOutOfBoundsException {
            if (index == getNumberOfChildren()) {
                // this is really an append
                addChild(child);
                return;
            } else {
                children.get(index); //just to throw the exception, and stop here
                children.add(index, child);
            }
        }
         
        public void removeChildAt(int index) throws IndexOutOfBoundsException {
            children.remove(index);
        }
     
        public String getData() {
            return this.data;
        }
     
        public void setData(String data) {
            this.data = data;
        }        
         
        public String getReference() {
            return reference;
        }

        public void setReference(String reference) {
            this.reference = reference;
        }

        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append("{").append(getData().toString()).append(",[");
            int i = 0;
            for (NodeTree e : getChildren()) {
                if (i > 0) {
                    sb.append(",");
                }
                sb.append(e.getData().toString());
                i++;
            }
            sb.append("]").append("}");
            return sb.toString();
        }
    }

    
    public static void makeCompatibility() {
        try {
            File file = new File("c:\\temp\\1\\Categories.xml");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(file);
            doc.getDocumentElement().normalize();
            Tree tree = new Tree();
            NodeTree nodeTree = new NodeTree("category");
            tree.setRootElement(nodeTree);
            parseXML(doc.getDocumentElement().getChildNodes(), tree.getRootElement());
            logger.info("hello");
        } catch (ParserConfigurationException e) {
            logger.error(e, e);
        } catch (IOException e) {
            logger.error(e, e);
        } catch (SAXException e) {
            logger.error(e, e);
        }
    }
    
    private static void parseXML(NodeList childnodes, NodeTree tree) {
        for(int i = 0; i < childnodes.getLength(); i++) {
            Node node = childnodes.item(i);
            if(node.getNodeType() == Node.ELEMENT_NODE) {
                NodeTree nodeTree = new NodeTree(node.getAttributes().getNamedItem("name").getTextContent(),
                                            node.getAttributes().getNamedItem("reference") != null ?
                                                    node.getAttributes().getNamedItem("reference").getTextContent() : "test");
                tree.addChild(nodeTree);
                parseXML(node.getChildNodes(), nodeTree);
            }
        }
    }
}



Добавлено через 9 минут и 42 секунды
Цитата(nc30 @  2.12.2010,  21:20 Найти цитируемый пост)
Samotnik, вроде бы есть готовые решения по деревьям, которые здесь уже обсуждались... 

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

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

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


 




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


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

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