转换<字符串 List<string>> 映射以将值更改为键

Transform a <string, List<string>> map to change values to be as keys

提问人:NEz 提问时间:11/14/2023 更新时间:11/14/2023 访问量:44

问:

我有一张下面的地图,其中包含该篮子中水果列表的篮子编号。

val basketMap = mapOf("basket1" to listOf("apples", "oranges", "grapes"),
                      "basket2" to listOf("oranges", "kiwi", "pineapple"),
                      "basket3" to listOf("grapes", "apples", "strawberry"))

我想将这张地图转换为水果,以列出水果所在的篮子 前任:

val finalExpectedResult = mapOf("apples" to listOf("basket1", "basket3"),
                                "oranges" to listOf("basket1", "basket2"),
                                "grapes" to listOf("basket1", "basket3"),
                                "kiwi" to listOf("basket2"),
                                "pineapple" to listOf("basket2")
                                "strawberry" to listOf("basket3"))

如何在 kotlin 中实现上面的地图finalExpectedResultbasketMap

Kotlin 哈希图

评论


答:

0赞 Greenylie 11/14/2023 #1
val finalExpectedResult = mutableMapOf<String, MutableList<String>>()

basketMap.forEach { (basket, fruits) -> 
    fruits.forEach { fruit -> //forEach fruit in all the entries
        if (finalExpectedResult[fruit] == null) { //Checks if it's not present as a key in the new map
            finalExpectedResult[fruit] = mutableListOf(basket) //If it's not present, it gets added as a key
        } else {
            finalExpectedResult[fruit]?.add(basket) //Otherwise the basket is added to the list of values of that key
        }
    }
}

这应该可以解决问题!

如果不存在,它会添加水果作为键,否则,它会将包含它的篮子添加到值列表中。

如果您需要地图是不可变的,只需调用并相应地分配它。finalExpectedResult.toMap()

3赞 broot 11/14/2023 #2

首先,将地图展平为对列表,然后再次分组:(basket, fruit)

basketMap.flatMap { (k, v) -> v.map { k to it } }
    .groupBy({ it.second }, { it.first })

如果我们的集合很大,我们可以改用序列:

basketMap.asSequence()
    .flatMap { (k, v) -> v.asSequence().map { k to it } }
    .groupBy({ it.second }, { it.first })

这样,我们就可以避免创建庞大的项目列表,而是在遍历源映射的同时构建映射。