2012-03-01 2 views
0

병합 경로의 NSArray에서 NSDictionary를 빌드하는 가장 좋은 방법은 무엇입니까? 과 같이, 경로 세그먼트와 파일 이름의있는 NSDictionary에경로 세그먼트의 배열에서 NSDictionary 만들기

<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> 

... : : 예를 들어,이 배열의 내용을 변환 할

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

이 먼저 찾는 것이 최선 파일 확장자 (.pack)로 항목을 배열하고 그 시점에서 구조를 다시 빌드 하시겠습니까? 배열의 내용을 통해 줄 단위로 구조체를 만들려고합니까?

도움을 주시면 대단히 감사하겠습니다.

+0

사용자의 입력 데이터의 불일치가있다 :

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)를 만들고 그것으로 각 경로를 삽입의 문제입니다. 일부 지점 노드 (예 :'packs /'및'packs/Children /')는 슬래시로 끝나고 다른 노드 (예 :'packs/Children/Letters' 및'packs/Children/Numbers')는 그렇지 않습니다. 그게 당신이 지원하고 싶은 것입니까, 아니면 그 오타입니까? –

+0

아니면 규칙은 간단합니다 : 노드가'.pack'으로 끝나면 그것은 잎 노드입니다. 그렇지 않으면 분기 노드입니다. 명확히하십시오. –

답변

1

나는 모든 잎 노드 .pack로 끝나는 모든 지점 노드가 간단하게하기 위해,하지 않는 것으로 가정 것이다.

사전은 키/값 쌍의 집합입니다. abc.pack 키의 값을 packs/Letters 사전에 포함시키려는 것이 명확하지 않습니다. 값으로 문자열 @"leaf node!"을 사용합니다.

경로를 사전 트리에 삽입하는 도우미 함수를 사용하면이 작업을 매우 쉽게 수행 할 수 있습니다.

NSMutableDictionary *treeWithPathArray(NSArray *paths) { 
    NSMutableDictionary *tree = [NSMutableDictionary dictionary]; 
    for (NSString *path in paths) 
     insertPathIntoTree(path, tree); 
    return tree; 
} 
+0

정말 고마워요! – Daniel

0

확장 기능을 사용하여 구조를 다시 빌드하는 것이 가장 좋습니다.

업데이트 이것은 간단한 예를

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); 
    }