powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / дерево
7 сообщений из 7, страница 1 из 1
дерево
    #37678700
Всем привет.
Задача вывести дерево элементов (язык - обжектив ц) только GUI - никакого поиска и тп. Как отрисовать в общем понятно, проблема в моей алгоритмической подготовке. Буду рад если меня пнут в сторону правильной книжки или статьи иль посоветуют чего нибудь. Все банально: у меня на входе массив обьектов, у которыз есть пара свойств id - parentid. Я строю дерево с помощью функции вида

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
+ (DocNode *)buildTreeFromList:(NSMutableArray *)nodeList andRoot:(DocNode *)root {
    for(int i = 0; i < [nodeList count]; i++) {
        DocNode *currentNode = [[DocNode alloc] initWithValue:(Doc*)[nodeList objectAtIndex:i]];  
        if([root.id isEqualToString:currentNode.parentId]) {
            currentNode = [self buildTreeFromList:nodeList andRoot:currentNode];
            [root addChild:currentNode]; 
            [nodeList removeObject: currentNode];
            NSLog(@"Building tree: add node %@ to parent %@", currentNode.id, currentNode.parentId);
        }
        [currentNode release];
    }
    return root;
}



Если абстрагироваться от специфики синтаксиса обж Ц то функция проще некуда:
на вход кидаем массив и корневой нод и дальше рекурсивно крутим в цикле элементы в поисках детей переданного рута. В моем решении DocNode - обертка над обьектом Doc: нужна чтобы добавить деревянную специфику: parent, children, addChild и тп.

Все работает, но у меня ощущение что я изобрел сортировку пузырьком :) Фатазии мне хватило только на то, тобы выкидывать добавляемый элемент из массива, да сделать сортировку входного массива по parent'у. Какие еще бывают решения этой задачи. Как бы вы сделали?
...
Рейтинг: 0 / 0
дерево
    #37678719
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж офтоп...

Как вообще кому-то в голову мог прийти в голову такой синтаксис для вызова методов?
Код: plaintext
1.
[nodeList objectAtIndex:i]
...
Рейтинг: 0 / 0
дерево
    #37678727
Типа философия посылки сообщений. По первости выносит мозги, но это дело привычки. А по теме что можешь сказать? Деревяшки строить не приходилось?
...
Рейтинг: 0 / 0
дерево
    #37678789
Anatoly MoskovskyРаз уж офтоп...

Как вообще кому-то в голову мог прийти в голову такой синтаксис для вызова методов?
Код: plaintext
1.
[nodeList objectAtIndex:i]


А че это вообще значит? Там оператор пробел переопределен чтоли?
...
Рейтинг: 0 / 0
дерево
    #37678866
###
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А че это вообще значит?Anatoly MoskovskyРаз уж офтоп...

Как вообще кому-то в голову мог прийти в голову такой синтаксис для вызова методов?
Код: plaintext
1.
[nodeList objectAtIndex:i]


А че это вообще значит? Там оператор пробел переопределен чтоли?

объекту nodeList посылается сообщение objectAtIndex с параметром i.
Чего непонятного-то?

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
дерево
    #37678944
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие еще бывают решения этой задачи. Как бы вы сделали?

В принципе всё правильно.

Обход дерева тут не нужен.
Ну и информацию эту -- список дочерних узлов в родителе -- лучше наверное сразу сохранить и никогда уже не
удалять, и потом по addChild/removeChild поддерживать, потому что если дерево реально большое, то строить его можно достаточно долго.
...
Рейтинг: 0 / 0
дерево
    #37679064
Спасибо за наводку. Попробую.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / дерево
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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