如何在Kotlin中根据另一列表的顺序对对象列表排序?
按自定义规则对Kotlin数据类列表排序
需求说明
现有Restrictions、AccountInfo、Display数据类及Target枚举类,需根据Restrictions.displayOrder中Display.key对应的Target顺序,对Restrictions.info列表里的AccountInfo按其target字段排序,最终顺序与displayOrder的key顺序一致。
实现步骤
- 补充
Target枚举的查找方法,方便通过targetText或target值定位枚举实例; - 基于
displayOrder构建target值到排序优先级的映射表,优先级由displayOrder的索引决定(索引越小,排序越靠前); - 使用该映射表对
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
相关产品推荐
相关产品推荐

