中文字典排序与多音字处理

简介

遇到一个需求,需要把银行列表进行字典排序。最初的实现是直接用了Java本身提供的类Collator。Collator这个类可以区分不同语言环境的Stirng来进行比较。然后在这里就遇到了一个坑,它把重庆银行排到了最后,也就是把重理解为了zhong。最后用了pinyin4j这个包,这个包可以处理多音字。

Collator实现

代码实现

public static void main(String[] args) {
        String [] banks = {"中国银行", "重庆银行", "上海浦东发展银行", "兴业银行"};
        Arrays.sort(banks, Collator.getInstance(Locale.CHINA));
        System.out.println(Arrays.toString(banks));
    }

运行结果

这里可以看到,除了重庆银行外,其他的都按照正常的排序了。这里就是遇到了多音字这个坑,把chong qing yin hang理解为了zhong qing yin hang。
这里写图片描述

pinyin4j实现

依赖包

使用pinyin4j需要引入依赖包

<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.1</version>
</dependency>

代码实现

public static void main(String[] args) {
    String [] banks = {"中国银行", "重庆银行", "上海浦东发展银行", "兴业银行"};

    Arrays.sort(banks, new Comparator<String>() {

        HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();
        @Override
        public int compare(String bank1, String bank2) {
            try {

                bank1 = PinyinHelper.toHanYuPinyinString(bank1, pinyinOutputFormat, " ", true);
                bank2 = PinyinHelper.toHanYuPinyinString(bank2, pinyinOutputFormat, " ", true);

            } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
                badHanyuPinyinOutputFormatCombination.printStackTrace();
            }
            return bank1.compareTo(bank2);
        }
    });
    System.out.println(Arrays.toString(banks));
}

运行结果

从结果可以看出,pinyin4j很好的处理了多音字。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/yanfeng9507/article/details/82023537