2010-05-17 118 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]]; 
相關問題