树遍历BFS

时间:2013-08-13 19:17:44

标签: ios objective-c

我有一个文件夹结构中的元素列表:

  • /folder/myfile.pdf
  • /folder/subfolder1/myfile.pdf
  • /folder/subfolder2/myfile.pdf
  • /folder/subfolder3/another/myfile.pdf

我的目标是遍历结构以构建与我的文件名匹配的文件数组,但是数组中项目的第一次出现将是最接近文件夹根目录的文件。

我被告知广度优先遍历,但我感到困惑。

我开始采用这种方法,但结果并不能满足我的需要......我将不胜感激任何帮助!

NSMutableArray * directories = [NSMutableArray new];
NSDirectoryEnumerator *enumerator = [[[NSFileManager defaultManager] enumeratorAtPath:url] retain] ;

if( [[filePath lastPathComponent] isEqualToString:@"myfile.pdf"] ){
    [directories addObject:[url stringByAppendingString:filePath]];
}

if(directories)
 sourceUrl_ = [[NSURL fileURLWithPath:[directoriesToWalk objectAtIndex:0] ] retain];

1 个答案:

答案 0 :(得分:2)

以下是您所描述内容的实例:

NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager]
                                     enumeratorAtPath:@"/Users/bdesham/Sites"];

NSMutableArray *htmlFiles = [NSMutableArray new];

NSURL *path;
while (path = [enumerator nextObject]) {
    if ([[path lastPathComponent] isEqualToString:@"index.html"]) {
        [htmlFiles addObject:@{ @"level" : [NSNumber numberWithInteger:[enumerator level]],
                                @"path" : path }];
    }
}

[htmlFiles sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [obj1[@"level"] integerValue] > [obj2[@"level"] integerValue];
}];

NSMutableArray *paths = [NSMutableArray arrayWithCapacity:[htmlFiles count]];

[htmlFiles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [paths addObject:obj[@"path"]];
}];

这里的想法如下:

  1. 枚举目标文件夹中的所有文件。
  2. 对于具有所需文件名的每个文件,将其添加到htmlFiles数组中。该文件被添加为字典,以便我们可以存储深度(调用-[NSDirectoryEnumerator level]的结果)以及每个文件名。
  3. 我们现在有一个包含我们可能感兴趣的所有文件的数组。
  4. 根据文件的深度(字典中的@"level"键)对数组进行排序。
  5. 我们不再需要字典中的路径名,因此请创建一个仅包含路径名的新数组(但按照与之前相同的顺序排列)。
  6. 在这段代码的末尾,paths数组包含名为“index.html”的所有文件的NSURL,其中文件最接近根,最远的文件是根最后。 (请注意,在同一目录级别的两个文件的数组中的排序是未定义的。)