map = mapOf((2: [3,4,5]), (7: [22,33,44]))
需要将其转换为
mapOf(3:2, 4:2, 5:2, 22:7, 33:7, 44:7)
尝试使用associate with forEach,不确定语法
发布于 2021-07-19 05:27:56
可能有一些更好的语法,但这应该足够好用了。
fun main() {
val map = mapOf(
2 to listOf(3, 4, 5),
7 to listOf(22, 33, 44)
)
val transformedMap = map.flatMap { entry ->
entry.value.map { it to entry.key }
}.toMap()
println(transformedMap)
}打印{3=2, 4=2, 5=2, 22=7, 33=7, 44=7}
请注意,toMap函数声明
返回的映射保留了原始集合的条目迭代顺序。如果两个对中的任何一个具有相同的密钥,最后一个将被添加到映射中。
因此,如果您在两个不同的列表中具有相同的值,则只有最后一个值将包含在映射中。
fun main() {
val map = mapOf(
2 to listOf(3, 4, 5),
7 to listOf(22, 33, 44),
8 to listOf(3)
)
val transformedMap = map.flatMap { entry ->
entry.value.map { it to entry.key }
}.toMap()
println(transformedMap)
}打印{3=8, 4=2, 5=2, 22=7, 33=7, 44=7}
发布于 2021-07-19 10:44:27
Zymus的答案是正确的,这也是我可能会写的。
但是,如果这是经常调用的东西,您可能希望将其提取到一个更高效的单独函数中。
fun <K, V> Map<K, Iterable<V>>.invert(): Map<V, K> {
val newMap = mutableMapOf<V, K>()
for ((key, iterable) in this) {
for (value in iterable) {
newMap[value] = key
}
}
return newMap
}用法:
fun main() {
val map = mapOf((2 to listOf(3, 4, 5)), (7 to listOf(22, 33, 44)))
val inverted = map.invert()
println(inverted)
}输出:
{3=2, 4=2, 5=2, 22=7, 33=7, 44=7}这在功能上等同于
map.flatMap { (key, values) -> values.map { it to key } }.toMap()包括这样的行为:如果原始输入中有重复的值,则只有最后一个值将保留为新的键。但是,flatMap版本创建了许多临时关键帧(原始关键帧的数量+ 1)和许多临时关键帧(原始值的数量),而此迭代版本不创建额外的对象。
https://stackoverflow.com/questions/68433158
复制相似问题