转换 <string, List<string>> 映射以将值更改为键

问题描述 投票:0回答:2

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

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 中实现上面

finalExpectedResult
basketMap
地图

kotlin hashmap
2个回答
0
投票
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()
并相应地分配它。


0
投票

首先,将其展平为成对的列表

(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 })
© www.soinside.com 2019 - 2024. All rights reserved.