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

Kotlin中如何使用同类型另一列表匹配更新目标列表元素

实现方案

场景说明

持有的两个列表属性:

  • allSkills:应用内所有可获取技能的全量列表
  • userSkills:用户账号下已拥有的技能列表
    核心需求:遍历allSkills时,若某技能id在userSkills中存在对应项,就用userSkills里的对象替换原全量列表的对象,无匹配则保留原全量对象。

实现逻辑

不推荐嵌套双循环遍历匹配(列表量大时性能差),先把userSkills转换成以技能id为键、技能对象为值的哈希表,后续遍历全量列表时可以O(1)时间复杂度直接查到对应的用户技能,匹配不到就保留原对象即可。

可运行代码示例

// 技能数据类定义
data class Skill(
    val id: Int,
    val note: Int?
)

fun main() {
    val allSkills = listOf(
        Skill(id = 0, note = null),
        Skill(id = 1, note = null)
    )
    val userSkills = listOf(
        Skill(id = 1, note = 2)
    )

    // 构建用户技能id映射表
    val userSkillMap = userSkills.associateBy { it.id }
    // 遍历全量列表完成替换
    val result = allSkills.map { originSkill ->
        userSkillMap[originSkill.id] ?: originSkill
    }

    // 打印输出结果:[Skill(id=0, note=null), Skill(id=1, note=2)]
    println(result)
}

补充说明

  • associateBy默认遇到同id重复项时会保留最后一个存入的对象,符合常规业务中同id技能为同一实体的逻辑,如果业务有重复id的特殊处理需求,可以自定义映射逻辑。
  • 该实现时间复杂度为O(m+n)(m为全量技能数、n为用户技能数),远优于双循环匹配的O(m*n),列表量级越大性能优势越明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 07:15:33