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

如何在Kotlin中根据另一列表的顺序对对象列表排序?

按自定义规则对Kotlin数据类列表排序

需求说明

现有Restrictions、AccountInfo、Display数据类及Target枚举类,需根据Restrictions.displayOrder中Display.key对应的Target顺序,对Restrictions.info列表里的AccountInfo按其target字段排序,最终顺序与displayOrder的key顺序一致。

实现步骤

  1. 补充Target枚举的查找方法,方便通过targetText或target值定位枚举实例;
  2. 基于displayOrder构建target值到排序优先级的映射表,优先级由displayOrder的索引决定(索引越小,排序越靠前);
  3. 使用该映射表对info列表进行排序。

完整代码实现

1. 完善Target枚举类

enum class Target(val target: Int, val targetText: String) {
    Target0(0, "NA"),
    Target1(1, "T1"),
    Target2(2, "T2"),
    Target5(5, "T5"),
    Target7(7, "T6");

    companion object {
        // 根据targetText获取对应的Target枚举
        fun getByTargetText(text: String): Target? = values().firstOrNull { it.targetText == text }
        // 根据target值获取对应的Target枚举
        fun getByTargetValue(value: Int): Target? = values().firstOrNull { it.target == value }
    }
}

2. 排序逻辑实现

data class Restrictions(
    val info: List<AccountInfo>,
    val displayOrder: List<Display>
)

data class AccountInfo(
    val name: String,
    val code: String,
    val target: Int
)

data class Display(
    val key: String,
    val value: String
)

// 核心排序函数
fun sortRestrictionsInfo(restrictions: Restrictions): List<AccountInfo> {
    // 构建target值到排序优先级的映射:displayOrder的索引即为优先级(越小越靠前)
    val targetPriorityMap = restrictions.displayOrder.mapIndexed { index, display ->
        Target.getByTargetText(display.key)?.target to index
    }
    .filterNotNull() // 过滤无法匹配到Target的情况
    .toMap()

    // 根据优先级对info列表排序,无匹配优先级的元素默认排到最后
    return restrictions.info.sortedBy { account ->
        targetPriorityMap.getOrDefault(account.target, Int.MAX_VALUE)
    }
}

3. 测试示例

fun main() {
    val sampleRestrictions = Restrictions(
        info = listOf(
            AccountInfo("name1", "code1", 1),
            AccountInfo("name2", "code2", 1),
            AccountInfo("name3", "code3", 1),
            AccountInfo("name4", "code4", 2),
            AccountInfo("name5", "code5", 2),
            AccountInfo("name6", "code6", 5),
            AccountInfo("name7", "code7", 5)
        ),
        displayOrder = listOf(
            Display("T5", "Account blocked"),
            Display("T1", "Account closed"),
            Display("T2", "Account opened")
        )
    )

    val sortedList = sortRestrictionsInfo(sampleRestrictions)
    sortedList.forEach { println(it) }
}

输出结果

AccountInfo(name=name6, code=code6, target=5)
AccountInfo(name=name7, code=code7, target=5)
AccountInfo(name=name1, code=code1, target=1)
AccountInfo(name=name2, code=code2, target=1)
AccountInfo(name=name3, code=code3, target=1)
AccountInfo(name=name4, code=code4, target=2)
AccountInfo(name=name5, code=code5, target=2)

内容的提问来源于stack exchange,提问作者james04

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:20:59