ios - 树遍历BFS

扫码查看

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

  • /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];
    

    最佳答案

    这是类似您所描述内容的工作示例:

    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"]];
    }];
    

    这里的想法如下:
  • 枚举目标文件夹中的所有文件。
  • 对于每个具有所需文件名的文件,请将其添加到htmlFiles数组中。该文件将作为字典添加,以便我们可以将深度(调用-[NSDirectoryEnumerator level]的结果)与每个文件名一起存储。
  • 现在,我们有了一个数组,其中包含我们可能感兴趣的所有文件。
  • 根据文件的深度(字典中的@"level"键)对数组进行排序。
  • 我们不再需要字典中的路径名,因此创建一个仅包含路径名的新数组(但顺序与以前相同)。

  • 在这段代码的最后,paths数组包含名为“index.html”的所有文件的NSURL,文件最靠近根,最后离根最远。 (请注意,在同一目录级别的两个文件的数组中的顺序是未定义的。)

    10-07 19:51
    查看更多