如何按自定义规则对Kotlin/Java中的User对象列表排序?
自定义规则排序实现方案
核心思路
先为需要自定义顺序的字段(group、city)创建优先级映射表,通过映射表将字符串转换为排序用的权重值,再结合常规的字母序/逆序规则,通过Comparator的链式调用组合排序逻辑。
Kotlin 实现
步骤1:定义优先级映射
先定义两个映射表,指定group和city的排序优先级:
val groupPriority = mapOf( "Maths" to 0, "Science" to 1, "English" to 2 ) val cityPriority = mapOf( "Sydney" to 0, "Adelaide" to 1, "Melbourne" to 2 )
- 映射值越小,排序越靠前;不在映射中的值默认赋值为
Int.MAX_VALUE,会排在所有指定值之后。
步骤2:编写Comparator并排序
利用Kotlin的compareBy、thenBy等扩展函数链式组合排序规则:
val users: List<User> = // 你的User列表 val sortedUsers = users.sortedWith(compareBy<User> { // 1. 按group自定义顺序排序 groupPriority.getOrDefault(it.group, Int.MAX_VALUE) }.thenBy { // 2. 按city自定义顺序排序 cityPriority.getOrDefault(it.address.city, Int.MAX_VALUE) }.thenByDescending { // 3. 按street逆字母序排序 it.address.street }.thenBy { // 4. 按name字母序排序 it.name })
Java 实现
步骤1:定义优先级映射
同样用HashMap定义优先级:
import java.util.HashMap; import java.util.Map; Map<String, Integer> groupPriority = new HashMap<>(); groupPriority.put("Maths", 0); groupPriority.put("Science", 1); groupPriority.put("English", 2); Map<String, Integer> cityPriority = new HashMap<>(); cityPriority.put("Sydney", 0); cityPriority.put("Adelaide", 1); cityPriority.put("Melbourne", 2);
步骤2:编写Comparator并排序
使用Comparator.comparing链式组合,结合getOrDefault处理未指定的字段值:
import java.util.ArrayList; import java.util.Comparator; import java.util.List; List<User> users = // 你的User列表 List<User> sortedUsers = new ArrayList<>(users); sortedUsers.sort(Comparator.comparing( user -> groupPriority.getOrDefault(user.getGroup(), Integer.MAX_VALUE) ).thenComparing( user -> cityPriority.getOrDefault(user.getAddress().getCity(), Integer.MAX_VALUE) ).thenComparing( user -> user.getAddress().getStreet(), Comparator.reverseOrder() ).thenComparing( User::getName ));
补充说明
如果需要将Address的字段移入User类(扁平化结构),只需将代码中user.address.city、user.address.street替换为user.city、user.street即可,排序逻辑无需改动。
内容的提问来源于stack exchange,提问作者AndroidDev
相关产品推荐
相关产品推荐

