首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Invert Map<K,List<V>> to Map<V,K>

Invert Map<K,List<V>> to Map<V,K>
EN

Stack Overflow用户
提问于 2021-07-19 05:18:45
回答 2查看 56关注 0票数 1

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,不确定语法

EN

回答 2

Stack Overflow用户

发布于 2021-07-19 05:27:56

可能有一些更好的语法,但这应该足够好用了。

代码语言:javascript
复制
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函数声明

返回的映射保留了原始集合的条目迭代顺序。如果两个对中的任何一个具有相同的密钥,最后一个将被添加到映射中。

因此,如果您在两个不同的列表中具有相同的值,则只有最后一个值将包含在映射中。

代码语言:javascript
复制
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}

票数 4
EN

Stack Overflow用户

发布于 2021-07-19 10:44:27

Zymus的答案是正确的,这也是我可能会写的。

但是,如果这是经常调用的东西,您可能希望将其提取到一个更高效的单独函数中。

代码语言:javascript
复制
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
}

用法:

代码语言:javascript
复制
fun main() {
    val map = mapOf((2 to listOf(3, 4, 5)), (7 to listOf(22, 33, 44)))
    val inverted = map.invert()
    println(inverted)
}

输出:

代码语言:javascript
复制
{3=2, 4=2, 5=2, 22=7, 33=7, 44=7}

这在功能上等同于

代码语言:javascript
复制
map.flatMap { (key, values) -> values.map { it to key } }.toMap()

包括这样的行为:如果原始输入中有重复的值,则只有最后一个值将保留为新的键。但是,flatMap版本创建了许多临时关键帧(原始关键帧的数量+ 1)和许多临时关键帧(原始值的数量),而此迭代版本不创建额外的对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68433158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档