Obj C: Группировка строк в NSMutableDictionary - PullRequest
2 голосов
/ 02 июня 2011

У меня есть NSArray, который содержит кучу строк. Каждая строка содержит родительский и дочерний тип, например:

Tool: Saw
Fruit: Apple
Fruit: Orange
Tree: Maple
Fruit: Banana
Tree: Oak
Tool: Hammer
Tree: Cedar

Моя последняя структура, в которую мне нужно поместить это (отсортированные родители и дети):

Fruit:
  - Apple
  - Banana
  - Orange
Tool:
  - Hammer
  - Saw
Tree:
  - Cedar
  - Maple
  - Oak

Я хотел бы знать, как сгруппировать их по родительскому типу, отсортировать по этому родительскому типу и отсортировать по дочерним. Я предполагаю, что лучше всего использовать NSMutableDictionary, чтобы превратить их в ключи и объекты.

Вот что я тестировал до сих пор, но не получается так, как я хочу:

// Add to tree
if ([tree objectForKey:pathParent]) {
    NSMutableArray *temp = (NSMutableArray *)[tree objectForKey:pathParent];
    [temp addObject:name];
    [tree removeObjectForKey:pathParent];
    [tree setObject:temp forKey:pathParent];

} else {
    [tree setObject:[NSMutableArray arrayWithObject:name] forKey:pathParent];
}//end

Как бы я это сделал?

Ответы [ 3 ]

0 голосов
/ 02 июня 2011

[NVM, я вижу, у вас это уже работает!Круто.]

Что-то вроде этого должно работать, вам нужно будет приправить и отладить по вкусу, конечно.Но это общая идея ...

- (NSDictionary*)categoriesAndSortedItemsFromItems:(NSArray*)source {

    //Given NSArray *source with the lines you described...

    NSMutableDictionary *categoriesAndItems = [NSMutableDictionary dictionaryWithCapacity:3];

    // Plug the items into the correct arrays by category
    for (NSString *line in source) {

        NSArray *components = [line componentsSeparatedByString:@": "];
        NSString *category = [components objectAtIndex:0]; //e.g. "tree"
        NSString *item = [components objectAtIndex:1]; //e.g. "oak"

        NSMutableArray *itemsForCategory = [self arrayInDict:categoriesAndItems forKey:category];

        [itemsForCategory addObject:item];
    }

    // Now run through and sort each array if you want...
    NSMutableDictionary *categoriesAndSortedItems = [NSMutableDictionary dictionaryWithCapacity:3];

    [categoriesAndItems enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

        NSArray *sorted = [(NSArray*)obj sortedArrayUsingSelector:@selector(compare:)];
        [categoriesAndSortedItems setObject:sorted forKey:key];
    }];

    return categoriesAndSortedItems;

}

 - (NSMutableArray*)arrayInDict:(NSMutableDictionary*)dict forKey:(NSString*)key {

        NSMutableArray *array = [dict objectForKey:key];

        if (!array)  {

            array = [[NSMutableArray alloc] initWithCapacity:10];

            [dict setObject:array forKey:key];

            [array release];
        }

        return array;
    }
0 голосов
/ 02 июня 2011

Это то, что я получил внутри цикла for:

if (pathParent != nil) {
    if ([tree objectForKey:pathParent]) {
        [[tree objectForKey:pathParent] addObject:name];
    } else {
        [tree setObject:[NSMutableArray arrayWithObject:name] forKey:pathParent];
    }//end
}//end
0 голосов
/ 02 июня 2011

Я думаю, что самым простым способом было бы выполнить сортировку по алфавиту в исходном списке

Tool: Saw
Fruit: Apple
Fruit: Orange
Tree: Maple
Fruit: Banana
Tree: Oak
Tool: Hammer
Tree: Cedar

Чтобы получить:

Fruit: Apple
Fruit: Banana
Fruit: Orange
Tool: Hammer 
Tool: Saw
Tree: Cedar
Tree: Maple
Tree: Oak

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

Вы также можете хранить элементы в дереве, чтобы вместо списка строк в формате «parent: node» у вас было дерево узлов с дочерними элементами. Это даст вам возможность иметь дочерние узлы с детьми и т. Д.

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

Дайте мне знать, если это не имеет смысла, и я уточню, чтобы уточнить.

...