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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:02