项目中遇到需要对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();
}
网友评论