如何对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]];