我想使用NSSortDescriptor对数组进行sorting
我有一个关于sorting数组数据库的问题:
NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES]; NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; [mGlossaryArray sortUsingDescriptors:sortDescriptors]; [sorter release];
这里在数据库中有一些第一个大写字母,由于大写字母,它没有显示我适当的sorting输出。 在这里我sortingrt“w”这是我的数据库中的表列的数组。 在这里,我附上了输出的屏幕截图,其中说“巨蟹座”比“c”更先出现,但这是不正确的,因为大写字母没有按字母sorting。
例如。 如果小写字母和“aCid”中有“able”,那么它会首先显示出来,然后才能够显示出来,而且如果第一个字母是首字母大写,例如“Able”和“a”,就会出现这种情况。 Able首先显示。
看看这里: 创build和使用sorting描述符
你可以比较为不区分大小写。
NSSortDescriptor *sorter = [[[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease]; NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; [mGlossaryArray sortUsingDescriptors:sortDescriptors];
只要使用NSSortDescriptor就像我用它和它工作得很好。
NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
我可以build议使用-localizedStandardCompare:(NSString)?
“只要文件名或其他string以类似于Finder的sorting的列表和表格的forms出现,就应该使用这种方法。在不同的语言环境下,这种方法的确切sorting行为是不同的,并且在将来的版本中可能会改变。
你可以使用这个按照名称也包含小写字母来sorting数组:
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)]; NSArray *sortDescriptors = [NSArray arrayWithObject:sorter]; [mGlossaryArray sortUsingDescriptors:sortDescriptors];
这个代码对我来说很好,根据字符sorting的名字也有小字符,如rocky,Ajay,john,Bob等
我认为这会对你有用。 它的文档在这里: string编程指南
添加这个由苹果公司写的小function。
int finderSortWithLocale(id string1, id string2, void *locale) { static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch; NSRange string1Range = NSMakeRange(0, [string1 length]); return [string1 compare:string2 options:comparisonOptions range:string1Range locale:(NSLocale *)locale]; }
确保将函数定义复制到标题中,否则在已sorting的数组上会出现编译错误。
对于你的sorting数组,使用这个方法:
[mGlossaryArray sortedArrayUsingFunction:finderSortWithLocale context:[NSLocale currentLocale]];
您的结果将如下所示:
- C
- 舱
- 咖啡店
- 癌症
- 中文
- 基督教
- 圣诞
- 可乐
这段代码对我来说工作正常。
- (void)sortSearchResultWithInDocumentTypeArray:(NSMutableArray *)aResultArray basedOn:(NSString *)aSearchString { NSSortDescriptor * frequencyDescriptor =[[NSSortDescriptor alloc] initWithKey:aSearchString ascending:YES comparator:^(id firstDocumentName, id secondDocumentName) { static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch; return [firstDocumentName compare:secondDocumentName options:comparisonOptions]; }]; NSArray * descriptors = [NSArray arrayWithObjects:frequencyDescriptor, nil]; [aResultArray sortUsingDescriptors:descriptors]; }
另一种forms的苹果取景器sorting与区域设置方法使用比较器块,如果你在一个ARC环境中,并且不想处理桥接转换,等等:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"your_string_key" ascending:YES comparator:^NSComparisonResult(id obj1, id obj2) { NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch; NSRange string1Range = NSMakeRange(0, ((NSString *)obj1).length); return [(NSString *)obj1 compare: (NSString *)obj2 options: comparisonOptions range: string1Range locale: [NSLocale currentLocale]]; }]; NSArray *sortedArray = [originalArray sortedArrayUsingDescriptors:@[sortDescriptor]];
为了提高效率,我也build议将当前语言环境存储在局部variables中。