有没有一种方法可以在Android中正确地排序国际字符串?我使用自定义比较器和compareTo()方法,但这对我来说还不够。我希望像“ö”这样的字母能够显示在“o”附近,但它们都在列表的末尾。我该如何强制比较器将它们视为与“o,a等”类似的字符?
要进行与本地语言相关的字符串比较,请使用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ęść]
一个排序器还应该在分解策略旁边设置一个强度:
final Collator collator = Collator.getInstance();
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.SECONDARY);
Collator.CANONICAL_DECOMPOSITION
和Collator.SECONDARY
强度是为了对重音符号/变音符号进行排序;如果您想对基于Unicode的字符进行排序,则完全分解可能会有所帮助;但这会减慢排序速度并需要更多内存。
Collator collator = Collator.getInstance(); collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION); collator.compare(one, two)
这里的第二个例子展示了CANONICAL_DECOMPOSITION
规则的作用:http://developer.android.com/reference/java/text/Collator.html - lomzaCollator.getInstance()
没有明确的Locale
参数会受到环境影响:它会返回一个适用于用户默认Locale的 Collator 实例。请参阅“小心默认Locale”文档。 - Grzegorz Rożniecki