我有一个带有法语字符串的数组,请说:“égrener”和“exact”我想对它进行排序,例如égrener是第一个。当我这样做时:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor];
NSArray *sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];
我在列表的末尾得到了é......我该怎么办?
由于
答案 0 :(得分:7)
NSString
中有一种便捷方法可以让您轻松进行此类排序:
NSArray *sortedArray = [myArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSString
的基础比较方法(compare:options:range:locale:
)为您提供了更多如何进行排序的选项。
编辑:以下是长篇故事:
首先,定义一个比较函数。这个适合自然字符串排序:
static NSInteger comparator(id a, id b, void* context)
{
NSInteger options = NSCaseInsensitiveSearch
| NSNumericSearch // Numbers are compared using numeric value
| NSDiacriticInsensitiveSearch // Ignores diacritics (â == á == a)
| NSWidthInsensitiveSearch; // Unicode special width is ignored
return [(NSString*)a compare:b options:options];
}
然后,对数组进行排序。
NSArray* myArray = [NSArray arrayWithObjects:@"foo_002", @"fôõ_1", @"fôõ_3", @"foo_0", @"foo_1.5", nil];
NSArray* sortedArray = [myArray sortedArrayUsingFunction:comparator context:NULL];
示例中的数组包含一些有趣的字符:数字,变音符号和unicode范围ff00中的一些字符。最后一个字符类型看起来像一个ASCII字符,但是以不同的宽度打印。
使用过的比较函数以人类可预测的方式处理所有情况。已排序的数组具有以下顺序:
foo_0
fôõ_1
foo_1.5
foo_002
fôõ_3