安卓如何比较特殊字符

7
有没有一种方法可以在Android中正确地排序国际字符串?我使用自定义比较器和compareTo()方法,但这对我来说还不够。我希望像“ö”这样的字母能够显示在“o”附近,但它们都在列表的末尾。我该如何强制比较器将它们视为与“o,a等”类似的字符?
2个回答

17

要进行与本地语言相关的字符串比较,请使用Collator。参考文档如下:

执行与本地语言有关的字符串比较。一个具体的子类RuleBasedCollator,允许通过使用规则集来自定义排序顺序。

比较字符串的示例:

 Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;)
 System.out.println(deCollator.compare("abcö", "abco"));

输出1


如果你想使用上述排序器对字符串列表进行排序,可以编写以下代码:

final List<String> strings = Arrays.asList(
        "über", "zahlen", "können", "kreativ", "Äther", "Österreich");
Collections.sort(strings, deCollator); // Collator implements Comparator
System.out.println(strings);

输出:

[Äther, können, kreativ, Österreich, über, zahlen]

编辑:刚刚注意到您是波兰人,因此下面提供波兰语的示例:


final List<String> strings = Arrays.asList(
        "pięć", "piec", "Pieczka", "pięść", "pieczęć", "pieczątka");
Collections.sort(strings, Collator.getInstance(new Locale("pl", "PL")));
System.out.println(strings);
// output: [piec, pieczątka, pieczęć, Pieczka, pięć, pięść]

谢谢你的好答案!;) 实际上,我发现了更简单的解决方案:Collator collator = Collator.getInstance(); collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION); collator.compare(one, two) 这里的第二个例子展示了 CANONICAL_DECOMPOSITION 规则的作用:http://developer.android.com/reference/java/text/Collator.html - lomza
1
注意,Collator.getInstance() 没有明确的 Locale 参数会受到环境影响:它会返回一个适用于用户默认Locale的 Collator 实例。请参阅“小心默认Locale”文档。 - Grzegorz Rożniecki
谢谢你的提醒,但我现在有些疑惑。我只需要对数据进行排序以向用户显示,而不是将其发送到其他地方或进行计算...所以默认语言环境可能就足够了?但如果我想正确地对德语和丹麦语字符进行排序并将它们用作机器输出,那么最好的选择应该是使用“Local.US”语言环境? - lomza
1
更新!果然使用明确的“Locale”是好的!当我将手机的语言环境更改为德语时,它省略了特殊字符,所以“CANNONICAL_DECOMPOSITION”不够用,你是正确的! - lomza

0

一个排序器还应该在分解策略旁边设置一个强度:

final Collator collator = Collator.getInstance();
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.SECONDARY);

Collator.CANONICAL_DECOMPOSITIONCollator.SECONDARY强度是为了对重音符号/变音符号进行排序;如果您想对基于Unicode的字符进行排序,则完全分解可能会有所帮助;但这会减慢排序速度并需要更多内存。


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