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

    技术2022-07-11  65

    徐师兄这次开门见山上代码!由于没时间整理直接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; } }
    Processed: 0.009, SQL: 9