中文按照拼音排序
pom.xml 引入
<!-- HanLP 核心库(便携版,内置基础词典) -->
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.6</version>
</dependency>
工具类
package com.media.web.utils;
import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.dictionary.py.Pinyin;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;
import java.text.Collator;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.stream.Collectors;
public class PinyinComparator {
/**
* 将中文字符串转换为拼音(自动处理多音字)
*/
private static String convertToPinyin(String text) {
if(text == null){
text = "";
}
// 1. 使用中文分词获取词语上下文
Segment segment = HanLP.newSegment().enableNameRecognize(true);
List<Term> termList = segment.seg(text);
// 2. 对每个词语转换拼音
StringBuilder pinyinBuilder = new StringBuilder();
for (Term term : termList) {
String word = term.word;
List<Pinyin> pinyinList = HanLP.convertToPinyinList(word);
for (Pinyin pinyin : pinyinList) {
// 去除声调
pinyinBuilder.append(pinyin.getPinyinWithoutTone());
}
}
return pinyinBuilder.toString();
}
public static Comparator<String> pinyinComparator() {
// 创建中文排序器
Collator collator = Collator.getInstance(Locale.CHINA);
Comparator<String> comparator = Comparator.comparing(
PinyinComparator::convertToPinyin,
collator
);
return comparator;
}
public static void main(String[] args) {
// 创建中文排序器
Comparator<String> comparator = pinyinComparator();
// 测试数据
List<String> words = Arrays.asList(
"重庆", // → chongqing
"重启", // → chongqi
"重量", // → zhongliang
"重大", // → zhongda
"重阳节", // → chongyangjie
"重复" // → chongfu
);
// 执行排序并输出
System.out.println("原始顺序: " + words);
List<String> sortedWords = words.stream()
.sorted(comparator).collect(Collectors.toList());
System.out.println("排序结果: " + sortedWords);
}
}
调用示例
// 创建中文排序器
Comparator<String> comparator = PinyinComparator.pinyinComparator();
// 排序规则
// 1. 伙伴 > 企微岗位 > 手动创建
// 2. 按名字拼音 a~z
list.sort(Comparator.comparingInt((SurSysGroup p) -> {
if (BaseConstants.GROUP_TYPE_AUTO_SYNC.equals(p.getGroupType())) {
return 0;
}
if (BaseConstants.GROUP_TYPE_AUTO_QIWEI.equals(p.getGroupType())) {
return 1;
}
return 2;
}).thenComparing(SurSysGroup::getName, comparator));
不积跬步,无以至千里;不积小流,无以成江海。
浙公网安备 33010602011771号