java List中元素按照拼音排序

2020-09-28  本文已影响0人  Angle_洛熙

项目中遇到需要对list结果集属性按照中文拼音排序场景。

代码如下:

在controller中,获取到devParamList后做如下处理:

    //获取商户list集合
    List<Map<String, Object>> devParamList = xxxxService.queryList();

    //Collections工具类的sort()方法对list集合元素排序 
    devParamList.sort(o1, o2) -> {
       //获取中文环境
            Comparator<Object> com = Collator.getInstance(java.util.Locale.CHINA);
             return com.compare(o1.get("name"), o2.get("name"));
              }
          });

9月28日更新

经过测试发现上面的排序,对多音字排序不够友好, 比如校(jiao)验会按照校(xiao)验排序。
查找资料发现,可以使用pinyin4j.jar, 是一个开源项目,可以直接当做工具类使用。
使用如下:

导入依赖

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

工具方法实现

 public void sortListByPinyin(List<Map<String, Object>> mapList) {
        mapList.sort((o1, o2) -> {
            char name1 = String.valueOf(o1.get("name")).charAt(0);
            char name2 = String.valueOf(o2.get("name")).charAt(0);
            String s1 = concatPinyinStringArray(PinyinHelper.toHanyuPinyinStringArray(name1));
            String s2 = concatPinyinStringArray(PinyinHelper.toHanyuPinyinStringArray(name2));
            return s1.compareTo(s2);
        });
    }

    private String concatPinyinStringArray(String[] pinyinArr) {
        StringBuilder sb = new StringBuilder();
        if (pinyinArr != null && pinyinArr.length > 0) {
            for (String s : pinyinArr) {
                sb.append(s);
            }
        }
        return sb.toString();
    }
上一篇下一篇

猜你喜欢

热点阅读