此文章发布于36
个月前,部分信息可能已经过时
,请自行斟酌确认。
使用 Collections.sort()
可以对集合进行排序,比如我们获取了用户列表,然后在 Java/Kotlin
中根据用户姓名
排序。
问题代码
Java
Collections.sort(userList, new Comparator<SysUser>(){
@Override
public int compare(SysUser o1, SysUser o2) {
return o1.getUserName().compareTo(o2.getUserName());
}
});
Kotlin
val list = sysUserService.getUserByUsergroupName(usergroupName)
return list.sortedBy { it.userName }
结果错误
上面的排序结果并不是我们想要的,主要是其中的 UserName
保存的是中文汉字
,我们期望能按汉语拼音字母
顺序排列。
解决方案
原因是 Collator
类执行区分语言环境的 String
比较。
使用此类可为自然语言文本构建搜索和排序例程。 若要针对不同语言,java 提供 Collator
来处理。Collator
是一个抽象基类。其子类实现具体的整理策略。Java 平台目前提供了 RuleBasedCollator
子类,它适用于很多种语言。还可以创建其他子类,以处理更多的专门需要。 与其他区分语言环境的类一样,可以使用静态工厂方法 getInstance
来为给定的语言环境获得适当的 Collator
对象。如果需要理解特定整理策略的细节或者需要修改策略,只需查看 Collator
的子类即可。
修改后 Java 代码:
Collections.sort(userList, new Comparator<SysUser>() {
@Override
public int compare(SysUser o1, SysUser o2) {
return Collator.getInstance(Locale.CHINESE).compare(o1.getUserName(),o2.getUserName());
}
});
// lambda 简化语法
Collections.sort(userList,(SysUser o1,SysUser o2)-> Collator.getInstance(Locale.CHINESE).compare(o1.getUserName(),o2.getUserName()));
修改后的 Kotlin 代码:
val list = sysUserService.getUserByUsergroupName(usergroupName)
return list.sortedWith { o1, o2 -> Collator.getInstance(Locale.CHINESE).compare(o1.userName, o2.userName) }
完~🌴