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

如何高效拆分Map<String, List<Item>>为两个含重叠键的Map

一次性拆分Map<String, List>为两个分类Map

需求说明

需要将一个Map<String, List<Item>>按Item的owned属性拆分为两个Map:

  • 一个仅包含所有owned=true的Item列表(对应原Map的键)
  • 另一个仅包含所有owned=false的Item列表(对应原Map的键)
    要求仅遍历原Map一次,提升效率。

解决方案(Kotlin实现)

首先定义Item数据类:

data class Item(val owned: Boolean)

核心拆分逻辑使用fold实现单次遍历:

val sourceMap = mapOf(
    "key1" to listOf(Item(owned = true), Item(owned = false)),
    "key2" to listOf(Item(owned = false), Item(owned = false)),
    "key3" to listOf(Item(owned = true), Item(owned = true))
)

// 单次遍历完成拆分
val (ownedMap, unOwnedMap) = sourceMap.fold(
    Pair(mutableMapOf<String, List<Item>>(), mutableMapOf<String, List<Item>>())
) { (ownedAcc, unOwnedAcc), (key, items) ->
    // 拆分当前键对应的Item列表
    val (ownedItems, unOwnedItems) = items.partition { it.owned }
    // 仅保留非空的子列表
    if (ownedItems.isNotEmpty()) ownedAcc[key] = ownedItems
    if (unOwnedItems.isNotEmpty()) unOwnedAcc[key] = unOwnedItems
    Pair(ownedAcc, unOwnedAcc)
}

逻辑说明

  1. 单次遍历:通过fold遍历原Map的每一个键值对,同时维护两个可变Map作为结果累加器
  2. 列表拆分:对每个键对应的Item列表,用partition快速拆分出符合条件的两个子列表
  3. 过滤空列表:仅当拆分后的子列表非空时,才将键值对加入结果Map,避免无效键的存在
  4. 结果解构:最后通过解构直接得到两个目标Map,完全匹配预期输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:40:37