一、需求
将城市列表(中文)按照首字母分组排序,以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
}
}