拼音排序工具类

编程入门 行业动态 更新时间:2024-10-23 04:58:58

<a href=https://www.elefans.com/category/jswz/34/1767611.html style=拼音排序工具类"/>

拼音排序工具类

拼音排序工具类

  1. maven依赖
<!--转化拼音-->
<dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</artifactId><version>2.5.1</version>
</dependency>
  1. java代码
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.apache.logging.log4j.util.Strings;import javax.validation.constraints.NotNull;
import java.util.*;/*** @author 陈建峰* @date 2023/1/29 9:43* @Description 拼音排序工具类*/
public class PinYinUtils {/*** 将一组中文数据按照首字母进行分组排序,排序深度2,** @param params [{name:"啊毕"},{name:"啊祖"}]* @param fieldName 要根据哪个字段排序* @return key: A value:["啊毕","啊祖]*/public static Map<Character, List<Map<String, Object>>> orderByPinYin(@NotNull List<Map<String, Object>> params,String fieldName) throws BadHanyuPinyinOutputFormatCombination {//要返回的数据Map<Character, List<Map<String, Object>>> result = new HashMap<>();//添加26小写字母的keychar c;for (c = 'a'; c <= 'z'; ++c) {result.put(c, new ArrayList<>());}//数据拼音转换格式HanyuPinyinOutputFormat pinyinOutputFormat = new HanyuPinyinOutputFormat();pinyinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);pinyinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);pinyinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);/*思路:【先按首字母进行排序,完成后再完成其他字符的顺序排序】1.遍历传入参数,获取到要转换的名称2.将名称转换为拼音3.放入到返回的数据中*/for (Map<String, Object> objectMap : params) {//要转换的字段名String name = (String) objectMap.get(fieldName);if (Strings.isBlank(name)) continue;//汉字char[] chineseCharacter = name.toCharArray();//存储转换后的拼音首字母StringBuilder stringBuilder = new StringBuilder();//每一个字for (Character character : chineseCharacter) {//判断char数据是否属于中文,中文进入转换,英文直接添加,数字与其他去除if (isChinese(character)) {//是中文String[] pinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(character, pinyinOutputFormat);stringBuilder.append(pinyinStringArray[0].charAt(0));} else if (Character.isLowerCase(character) || Character.isUpperCase(character)) {//是字母//转为小写字母if (Character.isUpperCase(character)) {char[] chars = character.toString().toLowerCase().toCharArray();character = chars[0];}stringBuilder.append(character);}}//数据首字母String str = stringBuilder.toString();objectMap.put("charPinYinName", str);char[] chars = str.toCharArray();//单个字母的数据List<Map<String, Object>> values = result.get(chars[0]);int e = 0;if (chars.length >= 2) {e = chars[1];}objectMap.put("orderNum", e);values.add(objectMap);}//进行排序for (c = 'a'; c <= 'z'; ++c) {List<Map<String, Object>> maps = result.get(c);if (maps.size() > 0) {maps.sort(new Comparator<Map<String, Object>>() {@Overridepublic int compare(Map<String, Object> o1, Map<String, Object> o2) {Integer orderNum1 = (Integer) o1.get("orderNum");Integer orderNum2 = (Integer) o2.get("orderNum");return orderNum1.compareTo(orderNum2);}});}}return result;}/*** 判断是否是中文** @param c 字符* @return*/private static boolean isChinese(char c) {Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {return true;}return false;}
}

更多推荐

拼音排序工具类

本文发布于:2023-06-29 10:50:45,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/943722.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:拼音   工具

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!