Создать NSDictionary из массива сегментов пути - PullRequest
0 голосов
/ 01 марта 2012

Каков наилучший метод для построения NSDictionary из NSArray сглаженных путей? Например, я хочу преобразовать содержимое этого массива:

<array>
<string>packs/</string>
<string>packs/Children/</string>
<string>packs/Children/Letters</string>
<string>packs/Children/Letters/abc.pack</string>
<string>packs/Children/Numbers</string>
<string>packs/Children/Numbers/123.pack</string>                                    
<string>packs/Children/Numbers/10_2_30.pack</string>
<string>packs/General/</string>
</array>

... в NSDictionary сегментов пути и имен файлов, например:

packs/
    Children/
    Letters/
        abc.pack
    Numbers/
        123.pack
        10_20_30.pack
    General/

Было бы лучше сначала поискать элементы массива с расширением файла (.pack) и построить структуру обратно из этой точки? Или попробуйте построить структуру построчно через содержимое массива?

Любая помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Я предполагаю, что все конечные узлы оканчиваются на .pack, а все узлы ветвления не для простоты.

Словарь - это набор пар ключ / значение.Непонятно, что вы хотите, чтобы значение ключа abc.pack было в словаре packs/Letters.Я просто использую строку @"leaf node!" в качестве значения.

Вы можете сделать это довольно легко с помощью вспомогательной функции, которая вставляет путь в дерево словаря.

void insertPathIntoTree(NSString *path, NSMutableDictionary *tree) {
    NSArray *components = [path pathComponents];
    for (int i = 0, count = components.count; i < count; ++i) {
        NSString *component = [components objectAtIndex:i];

        if (!component.length) {
            // This ignores a trailing slash, and any double slashes mid-path.
            continue;
        }

        if (i == count - 1 && [component hasSuffix:@".pack"]) {
            [tree setObject:@"leaf node!" forKey:component];
        }

        else {
            NSMutableDictionary *nextBranch = [tree objectForKey:component];
            if (!nextBranch) {
                nextBranch = [NSMutableDictionary dictionary];
                [tree setObject:nextBranch forKey:component];
            }
            tree = nextBranch;
        }
    }
}

Тогда этопросто создать исходное пустое дерево (NSMutableDictionary) и вставить в него каждый путь:

NSMutableDictionary *treeWithPathArray(NSArray *paths) {
    NSMutableDictionary *tree = [NSMutableDictionary dictionary];
    for (NSString *path in paths)
        insertPathIntoTree(path, tree);
    return tree;
}
0 голосов
/ 01 марта 2012

Лучше было бы первым, в котором вы построите структуру обратно, взглянув на расширение.

Обновлено Это простой пример

NSArray *arrayPaths = [NSArray arrayWithObjects:@"packs/", @"packs/Children/", @"packs/Children/Letters", @"packs/Children/Letters/abc.pack",  @"packs/Children/Numbers", @"packs/Children/Numbers/123.pack", @"packs/Children/Numbers/10_2_30.pack", @"packs/General/", nil];

    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    for (NSString *filePath in arrayPaths) {
        NSString *fileExtention = [filePath pathExtension];
        if (![fileExtention isEqualToString:@""]) {
            NSArray *pathComponents = [filePath pathComponents];
            NSMutableDictionary *tDict = nil;
            NSMutableDictionary *lastDict = dictionary;
            for (int i = 0; i < [pathComponents count] - 1; i++) {
                if (i == ([pathComponents count] - 2)) {
                    NSString *key = [pathComponents objectAtIndex:i];
                    NSMutableArray *array = [lastDict objectForKey:key];
                    if (array == nil) {
                        array = [NSMutableArray array];
                    }
                    [array addObject:[pathComponents lastObject]];
                    [tDict setObject:array forKey:key];
                    break;
                }
                NSString *key = [pathComponents objectAtIndex:i];
                tDict = [lastDict objectForKey:key];
                if (tDict == nil) {
                    tDict = [NSMutableDictionary dictionary];
                }
                [lastDict setObject:tDict forKey:key];
                lastDict = tDict;
            }
        }
        NSLog(@"%@",dictionary);
    }
...