You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按自定义规则对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:43:24