有没有办法在Android中正确排序国际字符串?我使用自定义比较器和compareTo()
方法,但这对我来说还不够。我希望像“ö”这样的字母显示在“o”附近,但所有字母都在列表的末尾。如何强制比较器认为它们与“o,a等”相似?
答案 0 :(得分:16)
对区域设置敏感的字符串comaprision使用Collator
。来自docs:
执行区分区域设置的字符串比较。一个具体的子类, RuleBasedCollator,允许自定义排序规则 使用规则集。
比较字符串的示例:
Collator deCollator = Collator.getInstance(Locale.GERMANY); // or new Locale("pl", "PL") for polish locale ;)
System.out.println(deCollator.compare("abcö", "abco"));
打印1
。
如果要使用上面的collator对字符串列表进行排序,可以写:
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ęść]
答案 1 :(得分:0)
整理者除分解策略外还应设置一个强度:
final Collator collator = Collator.getInstance();
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.SECONDARY);
Collator.CANONICAL_DECOMPOSITION
和Collator.SECONDARY
的强度要求对重音符号/变音符号进行分类;如果要对基于unicode的字符进行排序,则完全分解可能会有所帮助;但这会减慢排序速度,并需要更多内存。