Android比较特殊字母

时间:2012-02-21 12:00:08

标签: java android sorting comparator

有没有办法在Android中正确排序国际字符串?我使用自定义比较器和compareTo()方法,但这对我来说还不够。我希望像“ö”这样的字母显示在“o”附近,但所有字母都在列表的末尾。如何强制比较器认为它们与“o,a等”相似?

2 个答案:

答案 0 :(得分:16)

对区域设置敏感的字符串comaprision使用Collator。来自docs:

  

执行区分区域设置的字符串比较。一个具体的子类,   RuleBasedCollat​​or,允许自定义排序规则   使用规则集。

比较字符串的示例:

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

打印1


如果要使用上面的collat​​or对字符串列表进行排序,可以写:

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_DECOMPOSITIONCollator.SECONDARY的强度要求对重音符号/变音符号进行分类;如果要对基于unicode的字符进行排序,则完全分解可能会有所帮助;但这会减慢排序速度,并需要更多内存。

相关问题