【发布时间】:2012-03-11 17:51:16
【问题描述】:
有没有办法在 Android 中正确排序国际字符串?我使用自定义比较器和compareTo() 方法,但这对我来说还不够。我希望像“ö”这样的字母显示在“o”附近,但它们都在列表的末尾。如何强制比较器认为它们类似于“o、a 等……”?
【问题讨论】:
标签: java android sorting comparator
有没有办法在 Android 中正确排序国际字符串?我使用自定义比较器和compareTo() 方法,但这对我来说还不够。我希望像“ö”这样的字母显示在“o”附近,但它们都在列表的末尾。如何强制比较器认为它们类似于“o、a 等……”?
【问题讨论】:
标签: java android sorting comparator
要区分区域设置的字符串comaprision,请使用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 规则的作用:developer.android.com/reference/java/text/Collator.html
Collator.getInstance() 没有明确的Locale 是环境相关的:它返回一个适合用户的默认语言环境的 Collator 实例。请参阅“Be wary of the default locale”。
Local.US locale?
Locale 很好!当我将手机的语言环境更改为德语时,它省略了特殊字符,所以 CANNONICAL_DECOMPOSITION 是不够的,你是对的!
除了分解策略之外,整理者还应该有一个强度集:
final Collator collator = Collator.getInstance();
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.SECONDARY);
需要Collator.CANONICAL_DECOMPOSITION 和Collator.SECONDARY 强度才能对重音/变音符号进行排序;如果您想对基于 unicode 的字符进行排序,则完全分解会很有帮助;但这会减慢排序速度并需要更多内存。
【讨论】: