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
相关产品推荐
相关产品推荐

