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

7
我正在使用xcode4.3/Objective-C构建一个应用程序,并在尝试对NSMutableArray进行排序时遇到了问题。我将从sqlite数据库中填充它的字符串。问题出现在瑞典字符å,ä和ö上。
有序数组应该看起来像这样:as,br,ol,st,år,ög,ös。
但是当我使用选择器compare时,顺序是这样的:as,år,br,ol,ög,ös,st。
而当我使用localizedCompare时,顺序变为:as,år,br,ög,ol,ös,st。
根据旧线程,localizedCompare应该是解决方法,但我无法使其正确工作。如果我使用终端访问sqlite数据库并键入ORDER,我将获得正确的结果。我的问题是否与xcode或iphone模拟器中的某些设置有关,因为两者都不显示正确的顺序?或者localizedCompare是错误的方法?只要完成工作,我很乐意接受任何解决方法。谢谢。

你能提供你用来完成这个任务的代码吗? - Liftoff
我会检查一下 localizedStandardCompare: 是否有任何不同。如果失败,您可能需要实现自己的比较器(或者,如果您提到了 SQLite 数据库...如果您正在使用 Core Data,则可以通过在获取请求上设置排序描述符来让数据库进行排序)。 - rickster
本地化比较应该可以工作,但仅当您的区域设置(在您的计算机上)设置为瑞典时才能工作。我得到的奇怪事情是,如果我记录数组,则带有特殊字符的单词不会打印,而是显示为Unicode代码。如果我记录单个单词,它们将以正确的顺序记录。 - rdelmar
localizedStandardCompare: 没有正确地对数组进行排序。我的机器语言环境设置为瑞典,当我记录数组时,åäö显示为Unicode字符。我现在使用的解决方案是在我的SELECT语句中添加"ORDER BY",因为sqlite可以正确排序。然而,未来的项目中如何正确排序仍需探究。 - user1279526
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接