Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / дерево / 7 сообщений из 7, страница 1 из 1
26.02.2012, 18:34
    #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
26.02.2012, 18:44
    #37678719
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
дерево
Раз уж офтоп...

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

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


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

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


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

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

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

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

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


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