中文按照拼音排序

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));
posted @ 2025-06-23 10:13  亲爱的阿道君  阅读(11)  评论(0)    收藏  举报