我有一张以下地图,其中包含篮子编号以及该篮子中的水果列表。
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
地图
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()
并相应地分配它。
首先,将其展平为成对的列表
(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 })