我想使用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中。