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

时间:2014-10-17 08:12:11

标签: java arrays character-encoding

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

Arrays.sort(anArray);

'Albacete'之前返回'Álava',我想在'Álava'之前'Albacete'

非常感谢

3 个答案:

答案 0 :(得分:18)

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

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

相关问题:

对于更复杂的用例,您需要阅读java.text.Collator。这是一个例子:

Collections.sort(strs, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        Collator usCollator = Collator.getInstance(Locale.US);
        return usCollator.compare(o1, o2);
    }
});

如果预定义的排序规则都不符合您的要求,您可以尝试使用java.text.RuleBasedCollator

答案 1 :(得分:1)

你应该看看RuleBasedCollator

  

RuleBasedCollat​​or类是Collat​​or的具体子类   提供了一个简单的,数据驱动的表格整理器。有了这堂课你   可以创建一个自定义的基于表格的Collat​​or。 RuleBasedCollat​​or地图   用于对键进行排序的字符。

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

  

如果指定了由a控制的特殊排序规则   适用于整个collat​​or对象。所有未提及的字符都是   在整理顺序结束时。

答案 2 :(得分:0)

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

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