【问题标题】:fold pairs into map of set; create map entries if not existing already将对折叠成集合图;如果不存在,则创建地图条目
【发布时间】:2016-01-20 04:09:31
【问题描述】:

使用对列表,希望将它们转换为集合映射。

输入:对的列表是这样的

listOf(Pair('bob', UGLY), Pair('sue', PETTY), Pair('bob', FAT))

期望的输出是一个集合的映射,其中键是对的first,集合是second

mapOf('bob' to setOf(UGLY, FAT), 'sue' to setOf(PETTY))

我已经尝试过了,但是哇,这太冗长了。可以减少吗?

fun main(args: Array<String>) {
    var m = HashMap<Int, MutableSet<Int>>()
    listOf(1 to 1, 2 to 2, 1 to 3).map {
        val set = m.getOrPut(it.first, { listOf<Int>().toMutableSet() })
        set.add(it.second)
        set
    }
    println (m)
}
-> {1=[1, 3], 2=[2]}

// yet another version, yields the correct result, but I feel a lack of clarity 
// that maybe I'm missing a library function that would suit the purpose.
listOf(1 to 1, 2 to 2, 1 to 3).fold(m, {
    mapSet, pair ->
    val set = mapSet.getOrPut(pair.first, { listOf<Int>().toMutableSet() })
    set.add(pair.second)
    mapSet
})
-> {1=[1, 3], 2=[2]}

【问题讨论】:

  • 在您要求集合映射的问题中:mapOf('bob' to setOf(UGLY, FAT), ..,但您示例中的代码会生成列表映射:{1=[1, 3], 2=[2]}。你说的是哪一个?请选择一项并更正另一项。
  • 概念才是最重要的。请不要因为鲍勃又胖又丑而挂断电话,因为虽然这是真的,但这只是一种抽象。
  • 你知道,具体一点总是好的。请查看建议的修改
  • 您的编辑违背了我的意图。我想要一组结果
  • 我相信你认为方括号意味着列表吗?如果是这种情况,只需在 kotlin 中为自己打印一个集合,您就会看到 [...]

标签: kotlin


【解决方案1】:

您可以像这样使用groupBy,然后使用mapValues

fun main(args: Array<String>) {
    val pairs = listOf(Pair("bob", "UGLY"), Pair("sue", "PETTY"), Pair("bob", "FAT"))
    val result = pairs
            .groupBy { it.first }
            .mapValues { it.value.map { p -> p.second }.toSet() }
    println(result)
}

【讨论】:

  • 我不同意删除结果可能性的编辑
  • 我希望列出可用的选项,就像您之前的那样。如果您需要我编辑我的问题以支持更广泛的可能性,我会这样做。我认为能够理解您提供的所有收藏选项非常重要。
  • @activedecay 如果他先给出最佳答案,然后再给出替代答案,那很好。但不是作为理解最终答案必须遵循的“编辑:”线索——这不太清楚,就像只阅读提交日志来理解最终代码。我们不需要在答案本身中查看历史,只需查看最终答案,因为我们可以随时查看编辑历史。这是一个简化的案例,是“可能”的事情,其他情况更糟。
  • 我完全同意,也许我之所以希望它解释更多,是因为我对 kotlin 标准库没有更多了解。但是,从那以后,我一直在阅读您的 SO 帖子。我现在可以很高兴地报告,我感到不那么困惑了。 :)
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 2010-10-16
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多