Arhn - архитектура программирования

Создайте и заполните на лету вложенный NSMutatbleDictionary из древовидной структуры.

Мне трудно создать и заполнить на лету NSMutableDictionary из древовидной структуры.

Допустим, у вас есть узел, где

node.attributes извлекает NSArray пар ключ/значение

и

node.children извлекает NSArray узлов одного и того же типа.

как вы можете преобразовать это дерево во вложенное NSMutableDictionary?

мой подход состоит в том, чтобы попытаться создать NSMutableDictionary для каждого узла и заполнить его его атрибутами и дочерними элементами, создать новый NSMutableDictionary для каждого дочернего элемента и снова выполнить итерацию с ним... это звучит как рекурсия, не так ли

Следующий код работает для одного уровня в глубину (родительский и дочерний), но выдает SIGABRT для внуков и выше.

[self parseElement:doc.rootElement svgObject:&svgData];

где

-(void) parseElement:(GDataXMLElement*)parent svgObject:(NSMutableDictionary**)svgObject
{
    NSLog(@"%@", parent.name);

    for (GDataXMLNode* attribute in parent.attributes)
    {
        [*svgObject setObject:attribute.stringValue forKey:attribute.name];
        NSLog(@"  %@ %@", attribute.name, attribute.stringValue);
    }

    NSLog(@"  children %d", parent.childCount);
    for (GDataXMLElement *child in parent.children) {
        NSLog(@"%@", child.name);

        NSMutableDictionary* element = [[[NSMutableDictionary alloc] initWithCapacity:0] retain];

        NSString* key = [child attributeForName:@"id"].stringValue;

        [*svgObject setObject:element forKey:key];
        [self parseElement:child svgObject:&element];
    }
}

ОБНОВИТЬ:

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

очевидно, GDataXMLElement не отвечает на attributeForName, когда нет атрибутов, и поэтому мой код выдал некоторые исключения, которые трудно отлаживать, поскольку это рекурсивный метод

Я также принимаю во внимание все ваши предложения (связанные с передовой практикой).

С Уважением


  • Всегда полезно быть последовательным в том, как вы обрабатываете определения указателей, см. GDataXMLNode* attribute и GDataXMLElement *child в вашем коде. На мой взгляд, обычно лучше ставить звездочку прямо перед именем переменной, чтобы (вероятно, неправильно) возникали такие ситуации, как GDataXMLElement* child, someOtherChild. 14.06.2012

Ответы:


1

Обратите внимание, что я заменил ваши двойные косвенные обращения простым указателем. Единственный известный мне случай, когда указатели на указатели имеют смысл, — это связь с NSError. Я бы переписал эту часть кода:

-(void) parseElement:(GDataXMLElement*)parent svgObject:(NSMutableDictionary*)svgObject
{

for (GDataXMLNode* attribute in parent.attributes)
{
    // setObject:forKey: retains the object. So we are sure it won't go away.
    [svgObject setObject:attribute.stringValue forKey:attribute.name];
}


for (GDataXMLElement *child in parent.children) {
    NSLog(@"%@", child.name);
    // Here you claim ownership with alloc, so you have to send it a balancing autorelease.
    NSMutableDictionary* element = [[[NSMutableDictionary alloc] init] autorelease];

    // You could also write [NSMutableDictionary dictionary];

    NSString* key = [child attributeForName:@"id"].stringValue;

    // Here your element is retained (implicitly again) so that it won't die until you let it.
    [svgObject setObject:element forKey:key];
    [self parseElement:child svgObject:element];
}

}

Если вы не верите в магию неявного сохранения, просто прочитайте, что Apple говорит вам о setObject:forKey:

  • (void)setObject:(id)anObject forKey:(id)aKey Параметры

объект

The value for key. The object receives a retain message before being added to the dictionary. This value must not be nil.

EDIT: забыл о первой части:

NSMutableDictionary* svgData = [[NSMutableDictionary dictionary];
[self parseElement:doc.rootElement svgObject:svgData];
14.06.2012
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..