Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вывести категории в Java / 6 сообщений из 6, страница 1 из 1
18.05.2013, 11:42:18
    #38263125
Zhazhah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести категории в Java
Здравствуйте, понимаю тема изъезженная однако на Java примера не нашел. Есть простая таблица

Код: plsql
1.
2.
3.
4.
5.
id   parent   name
1    0        Программирование
2    1        Java
3    0        Базы данных
4    3        MySql





Как рекурсивно или другим способом вывести все категории учитывая вложенность и.тд??
...
Рейтинг: 0 / 0
18.05.2013, 11:53:33
    #38263133
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести категории в Java
Zhazhah,

Что именно вызывает затрудение? Java вообще? Работа с JDBC? Непосредственно рекурсия? Всё вместе? Вы что-то уже пробовали?
...
Рейтинг: 0 / 0
18.05.2013, 15:06:04
    #38263262
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести категории в Java
Zhazhah
Вы уже вывели). Остальное ГУИ
...
Рейтинг: 0 / 0
18.05.2013, 17:22:02
    #38263386
Zhazhah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести категории в Java
Blazkowicz,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
private void categoriesTree(int id, int depth) {

        LinkedHashMap<Integer, HashMap> Tree = new LinkedHashMap();

        try {

            ResultSet rs = stmt.executeQuery("SELECT * FROM `categories` WHERE `parent`=" + id + ";");

            while (rs.next()) {

                HashMap<String, String> content = new HashMap();

                content.put("name", rs.getString("name"));
                content.put("hurl", rs.getString("hurl"));
                content.put("depth", Integer.toString(depth));

                CategoriesTree.put(rs.getInt("id"), content);

                categoriesTree(rs.getInt("id"), depth);

            }

        } catch (SQLException e) {
            System.out.println(e);
        }
}



В итоге, исключение:
Код: java
1.
java.sql.SQLException: Operation not allowed after ResultSet closed
...
Рейтинг: 0 / 0
18.05.2013, 18:22:12
    #38263446
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести категории в Java
А зачем тут рекурсия? Вы создаёте новый resultSet закрывая старый.
Читайте все записи одним SQL запросом.
Все записи поместите в Map<Integer, Node>
Код: java
1.
2.
3.
4.
5.
6.
Node{
int id,
int parentId,
String name,
List<Node> children
}


После вычитки, пройдитесь по Map для каждой записи добавьте её в родителя:
Код: java
1.
map.get(node.parentId).children.add(node);
...
Рейтинг: 0 / 0
18.05.2013, 20:38:59
    #38263530
Zhazhah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести категории в Java
Blazkowicz, Спасибо за помощь.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
private class Node {

        int id;
        int parentId;
        String name;
        List<Node> children;
    }

    public ArserTest() {

        Map<Integer, Node> category = new LinkedHashMap();

        Node node = new Node();
        node.id = 1;
        node.parentId = 0;
        node.name = "Программирование";
        node.children = new LinkedList();
        category.put(1, node);

        node = new Node();
        node.id = 2;
        node.parentId = 1;
        node.name = "Web";
        node.children = new LinkedList();
        category.put(2, node);

        node = new Node();
        node.id = 3;
        node.parentId = 2;
        node.name = "Java, PHP";
        node.children = new LinkedList();
        category.put(3, node);


        HashSet<Integer> delete = new HashSet();

        for (Map.Entry<Integer, Node> entry : category.entrySet()) {
            if (category.containsKey(entry.getValue().parentId)) {
                category.get(entry.getValue().parentId).children.add(entry.getValue());
                delete.add(entry.getKey());
            }
        }

        for (Integer element : delete) {
            category.remove(element);
        }

        // вывод категорий
        for (Map.Entry<Integer, Node> entry : category.entrySet()) {
            System.out.println(category.get(entry.getKey()).name);
            ListIterator<Node> itr = category.get(entry.getKey()).children.listIterator();

            while (itr.hasNext()) {
                Node n = itr.next();
                System.out.println(n.name);
                
                ListIterator<Node> itr2 = n.children.listIterator();
                while (itr2.hasNext()) {
                    System.out.println(itr2.next().name);
                }
                
            }
        }


        //System.out.println(category.get(1).children.get(0).children.get(0).name);
        //System.out.println(category);

    }



Нельзя ли как то красивее выводить категории без этих вложенных циклов?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как вывести категории в Java / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]