【发布时间】: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