3

我有一个包含文件 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吗?

4

3 回答 3

1

试试看 - 将路径作为 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);
    }
}
于 2013-05-31T21:53:24.653 回答
1

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

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

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

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

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

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

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

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

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

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

于 2013-05-31T21:53:38.187 回答
1

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

NSArray * sortedStrings = [filelist sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
于 2013-05-31T22:04:29.943 回答