Java Android比较特殊字母

Java Android比较特殊字母,java,android,sorting,comparator,Java,Android,Sorting,Comparator,有没有办法在Android中正确排序国际字符串?我使用自定义比较器和compareTo()方法,但这对我来说还不够。我希望像这样的字母“ö”显示在“o”附近,但它们都在列表的末尾。我怎样才能强迫比较器认为它们类似于“o,a等…” 使用对区域设置敏感的字符串组合。从文档: 执行区分区域设置的字符串比较。一个具体的子类, RuleBasedCalator,允许通过 规则集的使用 比较字符串的示例: Collator deCollator = Collator.getInstance(Locale.

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

使用对区域设置敏感的字符串组合。从文档:

执行区分区域设置的字符串比较。一个具体的子类, RuleBasedCalator,允许通过 规则集的使用

比较字符串的示例:

 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);

编辑:刚刚发现你是波兰人,所以波兰人的例子如下:

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 List strings=Arrays.asList(
“皮耶奇”、“皮耶克”、“皮耶茨卡”、“皮耶茨奇”、“皮耶茨奇”、“皮耶茨卡”);
Collections.sort(strings、Collator.getInstance(新语言环境(“pl”、“pl”)));
System.out.println(字符串);
//输出:[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
强度要求对重音/umlauts进行排序;如果要对基于unicode的字符进行排序,则完全分解可能会有所帮助;但这会减慢排序速度,并需要更多内存。

谢谢您的精彩回答!;)实际上,我找到了更简单的解决方案:
Collator-Collator=Collator.getInstance();集合分解(collator.CANONICAL_分解);collator.compare(one,two)
这里的第二个示例显示了
规范分解
规则的作用:注意,
collator.getInstance()
没有显式的
Locale
依赖于环境:它返回一个适合用户默认区域设置的collator实例。谢谢你的警告,但我现在有点怀疑。我需要排序的数据只显示给用户,而不是发送到某个地方或计算的东西。。。那么默认的语言环境就足够了?但是如果我想正确地对德语和丹麦语字符进行排序并将它们用作机器输出,那么最好的选择是使用
Local.US
locale?更新!毕竟,使用显式的
语言环境是很好的!当我将手机的语言环境更改为德语时,它省略了特殊字符,因此,
CANNONICAL_分解
是不够的,你是对的!
final Collator collator = Collator.getInstance();
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
collator.setStrength(Collator.SECONDARY);