2010-05-17 119 views
34

我有一个对象数组,我需要他们按他们的“标题”键排序。目前它正在工作,虽然它使用ASCII排序而不是自然排序。标题是文件名,所以它们看起来像这样:如何对NSArray进行自然排序?

文件1
文件2
文件3
...
file10
FILE11
file12

我得到,你所期望的:

file1
file10
file11
file12
文件2
文件3
...

有谁知道,如果有一种方法内置到NSArray的排序功能得到这个自然排序,而不是按字母排序?我发现了一些通用算法,但我希望有内置的东西...

+0

http://stackoverflow.com/a/9509181/1224741 – QED 2014-02-15 06:06:30

回答

51

NSString s可以使用NSNumericSearch比较选项compared

一个版本:

NSInteger sort(Obj* a, Obj* b, void*) { 
    return [[a title] compare:[b title] options:NSNumericSearch]; 
} 

result = [array sortedArrayUsingFunction:&sort context:nil]; 

还是有点更通用:

NSInteger sort(id a, id b, void* p) { 
    return [[a valueForKey:(NSString*)p] 
      compare:[b valueForKey:(NSString*)p] 
      options:NSNumericSearch]; 
} 

result = [array sortedArrayUsingFunction:&sort context:@"title"] 

或者用块:

result = [array sortedArrayUsingComparator:^(Obj* a, Obj* b) { 
    return [[a title] compare:[b title] options:NSNumericSearch]; 
}]; 
+2

正是我一直在寻找! – 2010-05-17 02:59:34

+0

真棒,节省了很多时间 – gbk 2014-10-21 08:18:19

0

这适用于iOS

NSString *name0 = @"winter"; 
NSString *name1 = @"summer"; 
CFComparisonResult result = CFStringCompareWithOptions(
    (CFStringRef) name0, 
    (CFStringRef) name1, 
    CFRangeMake (0, CFStringGetLength((CFStringRef) name0)), 
    kCFCompareCaseInsensitive | kCFCompareLocalized | kCFCompareNumerically 
); 
4

基于@ PeterHosey的答案,如果你有一个String对象的数组工作:

简短的回答:

NSArray *orderedTitles = [unorderedTitles sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 

举例:

NSArray *unorderedTitles = @[ 
    @"file12", 
    @"file1", 
    @"file10", 
    @"file3", 
    @"file2", 
    @"file11" 
]; 

NSArray *orderedTitles = [unorderedTitles sortedArrayUsingSelector:@selector(localizedStandardCompare:)]; 
NSLog(@"orderedTitles = %@", orderedTitles); 
/* 
orderedTitles = (
    file1, 
    file2, 
    file3, 
    file10, 
    file11, 
    file12 
) 
*/ 
0

您也可以通过以下方式排序:

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES selector:@selector(localizedStandardCompare:)]; 
NSArray *sortedItems = [unsortedItems sortedArrayUsingDescriptors:@[sortDescriptor]]; 
相关问题