如何对NSArray进行自然sorting?

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

文件1
文件2
文件3

file10
FILE11
file12

我得到,如你所料:

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

有没有人知道是否有内置的NSArraysortingfunction,以获得这种自然sorting而不是按字母sorting? 我发现了一些通用的algorithm,但我希望有内置的东西…

NSString s可以使用NSNumericSearch比较选项进行比较。

一个版本:

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

那些试图在Mac OS X 10.6及更高版本和iOS 4及更高版本上复制Findersorting行为的人可以使用localizedStandardCompare:作为比较器select器。

那些在早期版本的Mac OS X和/或iOS上具有相同目标的人应该使用“string编程指南”中描述的解决scheme 。

基于@ 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 ) */ 

这适用于iOS

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

您也可以按以下方式进行sorting:

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