城市名称按首字母分组排序,并实现多音字处理

一、需求

将城市列表(中文)按照首字母分组排序,以26个字母的顺序进行分组。

传统的解决方式使用如下pinyin4j来解决:

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

但是该包对于多音字问题不好解决,例如:长沙市 会转化为zhangshashi,而不是changshashi。这会导致分组混乱,网上也有利用该包和字典的形式进行解决,但我始终觉得太麻烦,还得维护字典表。故而找到另外一种方式(jpinyin),加上自己写的处理类来实现想要的效果。

二、所需依赖

<dependency>
       <groupId>com.github.stuxuhai</groupId>
       <artifactId>jpinyin</artifactId>
       <version>1.1.8</version>
</dependency>

三、工具类

package com.ruoyi.hcmLink.utils;

import com.github.stuxuhai.jpinyin.PinyinException;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;

import java.text.Collator;
import java.util.*;

/**
 * @Description TODO
 * @Author Ann
 * @Time 2024/8/14
 */
public class ChangeChinesePinyinUtil {

    /**
     * 获取姓名全拼和首字母
     * PinyinFormat:WITH_TONE_MARK(声调模式),WITH_TONE_NUMBER(数字代表声调模式),WITHOUT_TONE(无声调模式)
     * @param  chinese 汉语名称
     * @return fullPinyin : 全拼   simplePinyin : 首字母  groupPinyin:微信用户组第一个字母
     * @throws PinyinException
     */
    public static Map<String, String> changeChinesePinyin(String chinese) throws PinyinException {
        Map<String, String> pinyin = new HashMap<String, String>();

        //将中文转化成拼音(全拼)
        String fullPinyin = PinyinHelper.convertToPinyinString(chinese,"", PinyinFormat.WITHOUT_TONE);
        //将中文转化为简拼模式(各汉字第一个字母组成)
        String simplePinyin = PinyinHelper.getShortPinyin(chinese);
        //首字母
        String firstPinyin = String.valueOf(simplePinyin.charAt(0));

        //判断是否多音字
//        System.out.println(PinyinHelper.hasMultiPinyin('啊'));//true

        pinyin.put("fullPinyin", fullPinyin);
        pinyin.put("simplePinyin", simplePinyin.toUpperCase());
        pinyin.put("groupPinyin", firstPinyin.toUpperCase());
        return pinyin;
    }
    /**
     * 按拼音首字母分组
     * @param list
     * @return
     */
    public static Map<String, List<String>> getCodeGroup(List<String> list) throws PinyinException{
        Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
        //按字母排序
        Collections.sort(list, com);
        //输出26个字母
        Map<String, List<String>> map = new TreeMap<String, List<String>>();
        for(int i=1;i<=26;i++){
            String word = String. valueOf((char) (96 + i)). toUpperCase();
            //循环找出首字母一样的数据
            List<String> letter = new ArrayList<String>();
            for (String str : list) {
                String code = changeChinesePinyin(str).get("groupPinyin");
                if(word.equals(code)) {
                    letter.add(str);
                }
            }
            map.put(word, letter);
        }
        return map;
    }


    public static void main(String[] args) throws PinyinException {
        List<String> list=new ArrayList<String>();
        list.add("阿巴坎");
        list.add("资阳市");
        list.add("钟祥市");
        list.add("钟楼区");
        list.add("元江哈尼族彝族傣族自治县");
        list.add("岫岩满族自治县");
        list.add("伊犁哈萨克自治州");
        Map<String, List<String>> codeGroup = getCodeGroup(list);
        System.out.println("codeGroup = " + codeGroup);


//        String str = "长沙市";
//        //设置声调表示格式
//        System.out.println(PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITH_TONE_MARK)); // nǐ,hǎo,shì,jiè
//        //数字表示声调
//        System.out.println(PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITH_TONE_NUMBER)); // ni3,hao3,shi4,jie4
//        //无声调
//        System.out.println( PinyinHelper.convertToPinyinString(str, ",", PinyinFormat.WITHOUT_TONE)); // ni,hao,shi,jie
//        //获取拼音首字母
//        System.out.println(PinyinHelper.getShortPinyin(str)); // nhsj
//        //判断是否多音字
//        System.out.println(PinyinHelper.hasMultiPinyin('啊'));//true
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值