【问题标题】:iOS: Sort files in a folder according to the order of an array [duplicate]iOS:根据数组的顺序对文件夹中的文件进行排序[重复]
【发布时间】:2013-05-31 21:35:19
【问题描述】:

我有一个文件夹,其中包含文件 B、C、A。这是我执行以下操作时它们出现的顺序:

    NSFileManager *filemgr;
    NSArray *filelist;
    int count;
    int i;

    filemgr =[NSFileManager defaultManager];
    filelist = [filemgr contentsOfDirectoryAtPath:myPathHere error:NULL];
    count = [filelist count];

    for (i = 0; i < count; i++)
    {

       NSLog(@"File %@ is at index: %d", [filelist objectAtIndex: i], i);

    }

如何对文件进行排序,使其与字符串数组的顺序相匹配,例如 A、B、C ?

我应该使用sortUsingDescriptors吗?

【问题讨论】:

  • 您真的需要对该文件夹中的文件进行排序还是对文件列表数组进行排序就足够了?
  • 我需要对它们进行排序@HermannKlecker。
  • 好吧,我问的是“A 还是 B”,你的答案是“是”。
  • 很公平! A - 我需要对该文件夹中的文件进行排序

标签: ios objective-c path nsfilemanager nssortdescriptor


【解决方案1】:

假设您的意思是按字符列表(单个字符串)的顺序,但这也可能更复杂:

  • 构造一个包含字符串(字符)的数组。如果你将有“Ca”和“C”,那么前者必须是第一个。

  • 用字符串创建一个字典,字符串是key,使用一个NSNumber表示它在数组中的顺序作为对象。

  • 创建一个单独的字典,给定前缀字母字符串,返回确保找到第一个字典中的每个键所需的最长可能匹配项

现在,当您获得文件列表时:

  • 以文件名的第一个字符为关键字,获取第一个搜索时使用的最大字符数。

  • 获取这些字符,并在第一个字典中查找匹配项。如果未找到,则将字符串长度一一减少,直到找到匹配项。现在您知道此文件名的顺序。将其添加到新字典中,文件名作为键,NSNumber 表示其顺序作为对象。

  • 从这个新字典中获取所有值的数组,并根据 NSNumber 的值对其进行排序。您需要丢弃重复项。

  • 重复获取具有指定值的字典对象。您可能希望根据其他一些标准进一步排序

因此,您可以决定要先以元音开头的文件名,然后是其他字符。所以你的第一个数组是“A”,“E”,“I”,“O”,“U”,“Y”,“B”,...

【讨论】:

  • 非常感谢您的回答。我早上去看看!
【解决方案2】:

这应该是字符串数组,所以对字符串进行排序

NSArray * sortedStrings = [filelist sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

【讨论】:

  • 非常感谢您的回答。我会在早上检查它,但我认为这只是对数组进行排序,而不是对磁盘上的文件进行排序
【解决方案3】:

试一试 - 将路径作为 NSURL 遍历并使用 NSURLLocalizedNameKey 属性:

NSFileManager *manager = [NSFileManager defaultManager];
NSArray *fileList = [manager contentsOfDirectoryAtURL:[NSURL fileURLWithPath:oneDir.path]
                        includingPropertiesForKeys:[NSArray arrayWithObject: NSURLFileResourceIdentifierKey]
                                           options:nil
                                             error:nil];

for (NSURL *f in fileList) {
    NSString *name = nil;
    if ([f getResourceValue:&name forKey:NSURLLocalizedNameKey error:nil]) {
        NSLog(@"%@",name);
    }
}

【讨论】:

  • @Stavesh。感谢您的建议。我尝试用 [NSURL fileURLWithPath:oneDir.path] 替换 [[NSBundle mainBundle] resourceURL] 这段代码,其中我的文件夹路径是 oneDir.path 和 NSURLLocalizedNameKey 用我的 Array 但它没有做任何事情。有什么想法吗?
  • 什么都没做 == 完全相同的顺序?
  • 以下代码是否正确:NSArray *fileList = [manager contentsOfDirectoryAtURL:[NSURL fileURLWithPath:oneDir.path] includingPropertiesForKeys:[NSArray arrayWithObject:self.forEachSalesCallAnArrayWithIndicesOfThumbnailsKeys] options:nil error:nil]; ?
  • 以上,我的数组是self.forEachSalesCallAnArrayWithIndicesOfThumbnailsKeys,我的路径是oneDir.path
  • 不,应该只替换 oneDir.path 部分。另一个数组是一个属性键数组,用于确定遍历的顺序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2013-12-24
  • 1970-01-01
  • 2020-08-21
  • 2010-10-24
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多