Java/Kotlin:List 集合使用 sort 对中文汉字进行排序

此文章发布于 6 个月前,部分信息可能已经过时,请自行斟酌确认。

使用 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) }

完~🌴

最后修改:2022 年 03 月 02 日 10 : 01 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论