我想使用 NSSortDescriptor 对数组排序

我在对一个 W.r.t 数据库进行排序时遇到了一个问题:

NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"w" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];


[mGlossaryArray sortUsingDescriptors:sortDescriptors];
[sorter release];

在数据库中有一些第一个大写字母,因为这个大写字母它没有显示我正确的排序输出。这里我用 r.t“ w”对数组进行排序,这是我在数据库中的表列。 这里我附上了输出的屏幕截图,显示“ Cancer”排在“ c”之前,但这是不正确的,因为大写的单词没有按字母顺序排序。

例如,如果小写中有“ Able”和“ aCid”,那么它将首先显示 aCid,然后才是 Able,还有一种情况是,如果第一个字母是大写,那么它将首先出现例如,“ Able”和“ a”。这里 Able 先显示。enter image description here

44406 次浏览

看看这里: 创建和使用排序描述符

可以比较为不区分大小写。

NSSortDescriptor *sorter = [[[NSSortDescriptor alloc]
initWithKey:@"w"
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSArray *sortDescriptors = [NSArray arrayWithObject: sorter];
[mGlossaryArray sortUsingDescriptors:sortDescriptors];

我想这个对你有用,相关的文件在这里: 字符串编程指南

添加这个由 Apple 编写的小函数。

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

确保将函数定义复制到头文件中,否则将在排序的数组上得到一个编译错误。

对于已排序的数组,请使用以下方法:

[mGlossaryArray sortedArrayUsingFunction:finderSortWithLocale context:[NSLocale currentLocale]];

你的结果会是这样的:

  • C
  • 小木屋
  • 咖啡馆
  • 癌症
  • 中国人
  • 基督教
  • 圣诞节
  • 可乐

我可以建议使用-localizedStandardCompare: (NSString)吗?

”在适合使用 Finder 式排序的列表和表中显示文件名或其他字符串时,应使用此方法。这种方法的确切排序行为在不同的地区有所不同,在以后的版本中可能会有所改变。”

这个代码对我来说没问题。

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

您可以使用它根据也包含 小字母的名称对数组进行排序:

NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"w" ascending:YES selector:@selector(caseInsensitiveCompare:)];


NSArray *sortDescriptors = [NSArray arrayWithObject:sorter];


[mGlossaryArray sortUsingDescriptors:sortDescriptors];

这段代码可以很好地根据字母表对名字进行排序,字母表中也包含小字符,例如 Rocky、 Ajay、 john、 Bob 等。

只要像我一样使用 NSSortDescriptor 就可以了。

   NSSortDescriptor * sortByRank = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];

另一种使用 locale 方法的苹果查找器排序的替代形式是使用比较器块,如果你处于 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]];

为了提高效率,我也建议将当前语言环境存储在局部变量中。