Java对List集合中的对象的某个中文字段按照拼音首字母进行排序

徐师兄这次开门见山上代码!由于没时间整理直接controller层写了一个测试代码

@RequestMapping(value = "/get", method = RequestMethod.GET)
    public Object get(){
    
    
        List<Map<String, Object>> list = testMapper.get();
        List<String> nameList =
        list.stream()
                .map(element->element.get("buildingName").toString().substring(0, 1))
                .map(i-> PinyinUtils.converterToFirstSpell(i).toLowerCase())
                .sorted()
                .collect(Collectors.toList());
        System.out.println(Arrays.toString(nameList.toArray()));
        System.out.println(nameList.size());

        Comparator comparator = Collator.getInstance(Locale.CHINA);
        Collections.sort(list, (p1, p2) -> comparator.compare(PinyinUtils.converterToFirstSpell(p1.get("buildingName").toString().substring(0,1)).toLowerCase(), 
                PinyinUtils.converterToFirstSpell(p2.get("buildingName").toString().substring(0,1)).toLowerCase()));
        list.stream().forEach(System.out::println);
        return nameList;
    }

这个是为了处理返回的list 里面的需要根据buildingName这个字段进行首字母排序,而且字段值有中文有英文;
这时候有人就要去百度 但是百度查的附上链接https://blog.csdn.net/yh869585771/article/details/84964393但是人家说了“如果name这个字段有英文,那么将排到所有汉字前面,总体来说,优先级是:英文字母>汉字”,显然不符合咱们的需求!另外发现 对于
嗯嗯的处理不了百度一下发现居然不读en!百度的
以下来自百度百科:

普通话标准发音:
许多人常把“嗯”与“恩”的拼音及发音混为一谈。把“嗯”的拼音误会成“en”,实际无论翻新老字典“嗯”的拼音一直是“ng”,“恩”的拼音才是“en”。
从字的结构可得知“嗯(ng)”的用途在于日常交谈中的语气辅助。那“嗯(ng)”的发音怎么读呢?很简单,只需要紧闭双唇后使用鼻腔哼鸣发音即可发出“嗯(ng)”的音。

好吧 即使这样也不至于处理不了 直接把嗯开头的放到最后面!!下面徐师兄根据之前的经验有一个汉字转换拼音的工具包,立马就来了想法 排序的时候获取字段的第一个字,英文就是第一个字母,进行比较排序;徐师兄还特意测试了一下汉字取第一个字节是不是完整的 结果取出来是完整的一个汉字,因为考虑到:一个汉字多少字节?这个问题一个汉字多少字节连接在此 点开即可享用

 String test = "这是汉字";
 String test1 = "zhe shi";
 System.out.println(test.substring(0, 1));
 System.out.println(test1.substring(0, 1));
// 结果
这
z

然后思路就来了,根据第一个字的首字母排序

Comparator comparator = Collator.getInstance(Locale.CHINA);
        Collections.sort(list, (p1, p2) -> comparator.compare(PinyinUtils.converterToFirstSpell(p1.get("buildingName").toString().substring(0,1)).toLowerCase(),
                PinyinUtils.converterToFirstSpell(p2.get("buildingName").toString().substring(0,1)).toLowerCase()));
        list.stream().forEach(System.out::println);

搞定了~
在这里插入图片描述
附上pinyin4j的maven依赖:

<!-- https://mvnrepository.com/artifact/com.belerweb/pinyin4j -->
<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.0</version>
</dependency>

常用工具类:

public class PinyinUtils {
    
    

    /**
     * 获得汉语拼音首字母
     *
     * @param chines 汉字
     * @return
     */
    public static String getAlpha(String chines) {
    
    
        String pinyinName = "";
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
    
    
            if (nameChar[i] > 128) {
    
    
                try {
    
    
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(
                            nameChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
    
    
                    e.printStackTrace();
                }
            } else {
    
    
                pinyinName += nameChar[i];
            }
        }
        return pinyinName;
    }

    /**
     * 将字符串中的中文转化为拼音,英文字符不变
     *
     * @param inputString 汉字
     * @return
     */
    public static String getPingYin(String inputString) {
    
    
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        format.setVCharType(HanyuPinyinVCharType.WITH_V);
        String output = "";
        if (inputString != null && inputString.length() > 0
                && !"null".equals(inputString)) {
    
    
            char[] input = inputString.trim().toCharArray();
            try {
    
    
                for (int i = 0; i < input.length; i++) {
    
    
                    if (java.lang.Character.toString(input[i]).matches(
                            "[\\u4E00-\\u9FA5]+")) {
    
    
                        String[] temp = PinyinHelper.toHanyuPinyinStringArray(
                                input[i], format);
                        output += temp[0];
                    } else
                        output += java.lang.Character.toString(input[i]);
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
    
    
                e.printStackTrace();
            }
        } else {
    
    
            return "*";
        }
        return output;
    }

    /**
     * 汉字转换位汉语拼音首字母,英文字符不变
     *
     * @param chines 汉字
     * @return 拼音
     */
    public static String converterToFirstSpell(String chines) {
    
    
        String pinyinName = "";
        char[] nameChar = chines.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < nameChar.length; i++) {
    
    
            if (nameChar[i] > 128) {
    
    
                try {
    
    
                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(
                            nameChar[i], defaultFormat)[0].charAt(0);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
    
    
                    e.printStackTrace();
                }
            } else {
    
    
                pinyinName += nameChar[i];
            }
        }
        return pinyinName;
    }

    public static void main(String[] args) {
    
    
        System.out.println(converterToFirstSpell("业户名称"));
        //带括号的不行
        //System.out.println(getAlpha("吨(座)位"));
        System.out.println(getPingYin("业户名称"));
    }
	public static JSONObject transforToEnglishJsonObjectTransport(JSONObject jsonObject){
    
    
	        //TODO 过滤特殊汉字
	        String dunCount = StringUtil.objToString(jsonObject.remove("吨(座)位"));
	        //fastjson解析方法
	        JSONObject newObject = new JSONObject();
	        newObject.put("dunCount", dunCount);
	        //下面遍历操作 不允许remove put 操作
	        for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
    
    
	            String key = entry.getKey();
	            String value = StringUtil.objToString(entry.getValue());
	//            jsonObject.remove(key);
	            String newKey = PinyinUtils.getPingYin(key);
	            newObject.put(newKey, value);
	        }
	        return newObject;
	    }
}

猜你喜欢

转载自blog.csdn.net/blackxc/article/details/107072391