如何在Kotlin中提取列表各类型最后一个元素并按指定顺序移至末尾
优化后的Kotlin函数式实现
原有实现存在两个可优化点:
- 逐次调用
last筛选对应type元素会导致多次遍历全列表,type数量较多时性能损耗明显 minus操作需要逐个匹配元素是否属于待移除集合,存在冗余计算
最优实现代码
data class Player(val id: Int, val type: Int) val players = listOf<Player>( Player(1, 1), Player(2, 1), Player(3, 2), Player(4, 2), Player(5, 2), Player(6, 2), Player(7, 2), Player(8, 3), Player(9, 3), Player(10, 3), Player(11, 3), Player(12, 3), Player(13, 4), Player(14, 4), Player(15, 4) ) // 单次遍历生成每个type对应最后一个元素的映射,后续同type元素会自动覆盖之前的取值 val typeLastMap = players.associateBy { it.type } // 按指定的type顺序生成subs列表 val requiredTypeOrder = listOf(1, 2, 3, 4) val subs = requiredTypeOrder.map { typeLastMap.getValue(it) } // 过滤掉各type的最后一个元素得到主力列表 val mainTeamPlayers = players.filterNot { it == typeLastMap[it.type] } // 拼接得到最终列表 val finalTeam = mainTeamPlayers + subs println(finalTeam)
实现优势
- 纯函数式写法,无可变集合声明,代码更简洁易读
- 时间复杂度仅为O(n),仅需2次全列表遍历,列表规模越大、type数量越多,性能优势越明显
- 扩展性强,调整type的输出顺序仅需要修改
requiredTypeOrder列表即可,不需要改动其他逻辑 - 可灵活处理异常场景:如果存在指定type不存在的情况,将
getValue替换为getOrDefault配合默认值/空校验即可适配需求
内容的提问来源于stack exchange,提问作者Sharan
相关产品推荐
相关产品推荐

