gpt4 book ai didi

ios - 树遍历 BFS

转载 作者:行者123 更新时间:2023-11-29 10:56:17 28 4
gpt4 key购买 nike

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

  • /文件夹/myfile.pdf
  • /folder/subfolder1/myfile.pdf
  • /文件夹/子文件夹2/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"]];
}];

这里的思路是这样的:

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

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

关于ios - 树遍历 BFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217351/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com