Java 使用特殊字符(如重音符号)排序数组

Java 使用特殊字符(如重音符号)排序数组,java,arrays,character-encoding,Java,Arrays,Character Encoding,有人知道如何使用带有特殊字符(如重音)的单词来排序数组吗 Arrays.sort(anArray) 返回'Albacete'之前的'Albacete',我想在'Albacete'之前返回'Albacete' 非常感谢您应该看看 RuleBasedCollector类是Collator的一个具体子类,它 提供一个简单的、数据驱动的表格整理器。有了这门课你 可以创建自定义的基于表格的折叠器。基于规则的振荡器映射 用于对键进行排序的字符 RuleBasedCalator对效率有以下限制(其他子类可用于

有人知道如何使用带有特殊字符(如重音)的单词来排序数组吗

Arrays.sort(anArray)

返回
'Albacete'
之前的
'Albacete'
,我想在
'Albacete'
之前返回
'Albacete'


非常感谢

您应该看看

RuleBasedCollector类是Collator的一个具体子类,它 提供一个简单的、数据驱动的表格整理器。有了这门课你 可以创建自定义的基于表格的折叠器。基于规则的振荡器映射 用于对键进行排序的字符

RuleBasedCalator对效率有以下限制(其他子类可用于更复杂的语言):

如果指定了由控制的特殊排序规则,则 应用于整个collator对象。所有未提及的字符均为 在排序规则顺序的末尾


如果只想对字符串进行排序,就好像它们没有重音一样,可以使用以下命令:

Collections.sort(strs, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        o1 = Normalizer.normalize(o1, Normalizer.Form.NFD);
        o2 = Normalizer.normalize(o2, Normalizer.Form.NFD);
        return o1.compareTo(o2);
    }
});

如果预定义的排序规则都不符合您的需要,您可以尝试使用。

使用类似以下的比较器:)并对列表进行排序

Comparator<String> accentIgnorantComparator = (o1, o2) -> {
    return StringUtils.stripAccents(o1).compareTo(StringUtils.stripAccents(o2));
};
Comparator accentIgnorantComparator=(o1,o2)->{
返回StringUtils.stripeAccents(o1).compareTo(StringUtils.stripeAccents(o2));
};

您必须编写自己的
比较器
并将其传递给
数组。sort()
。默认情况下,字符串是根据自然顺序排序的。(请注意,如果您使用的是数组而不是列表,则可以从
Collections.sort
更改为
Arrays.sort
Normalizer.Form.NFD
非常好地将法语的“重音”排序为常规的“E”之后。谢谢仅供参考:我发现Normalizer.Form.NFD有问题。。。波兰语“Ł”在Z之后排序,应该在“L”之后。这让我大吃一惊,因为所有其他重音字母都排序得很好!我想知道这是不是一个错误。确认了,这是一个错误。为了修复它,你可以切换到,但我不想让我的应用程序变大,所以我只编写了一个实用函数
return Normalizer.normalize(src,form).replaceAll(“Ł”,“L”)
Comparator<String> accentIgnorantComparator = (o1, o2) -> {
    return StringUtils.stripAccents(o1).compareTo(StringUtils.stripAccents(o2));
};