简介
遇到一个需求,需要把银行列表进行字典排序。最初的实现是直接用了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很好的处理了多音字。