当字符串包含åäö时,如何按字母顺序对字符串数组进行排序?

时间:2012-03-28 17:08:17

标签: objective-c arrays sorting

我正在使用xcode4.3 / Objective-C构建应用程序,并且在尝试对NSMutableArray进行排序时遇到了问题。我将使用sqlite数据库中的字符串填充它。问题出现在瑞典人物å,ä和ö上。

orded数组看起来像这样:as,br,ol,st,år,ög,ös。

但是当我使用选择器比较顺序是这样的:as,år,br,ol,ög,ös,st。

当我使用localizedCompare时,订单更改为:as,år,br,ög,ol,ös,st。

根据较旧的线程,localizedCompare应该是解决方案,但我无法使其正常工作。如果我使用终端访问sqlite数据库并输入ORDER,我将得到正确的结果。我的问题可能与xcode或iphone模拟器中的某些设置有关,因为两者都没有显示正确的顺序?或者本地化比较错误的方式去?只要完成工作,我就会高兴地接受任何变通办法。感谢。

1 个答案:

答案 0 :(得分:13)

您可以使用compare:options:range:locale:并明确指定瑞典语语言环境来使其工作,如下所示:

NSArray *strings=[NSArray arrayWithObjects:@"as", @"ol", @"st", @"br", @"ög", @"år", @"ös", nil];
NSLocale *locale=[[NSLocale alloc] initWithLocaleIdentifier:@"sv_SE"];

NSArray *sorted=[strings sortedArrayUsingComparator:^(NSString *first, NSString *second) {
    return [first compare:second
                  options:0
                    range:NSMakeRange(0, [first length])
                   locale:locale];
}];

for (NSString *s in sorted) { NSLog(@"%@", s); }

输出结果为:

2012-04-10 08:08:18.139 Untitled[32416:707] as
2012-04-10 08:08:18.140 Untitled[32416:707] br
2012-04-10 08:08:18.141 Untitled[32416:707] ol
2012-04-10 08:08:18.142 Untitled[32416:707] st
2012-04-10 08:08:18.142 Untitled[32416:707] år
2012-04-10 08:08:18.143 Untitled[32416:707] ög
2012-04-10 08:08:18.143 Untitled[32416:707] ös