提问人:NEz 提问时间:11/14/2023 更新时间:11/14/2023 访问量:44
转换<字符串 List<string>> 映射以将值更改为键
Transform a <string, List<string>> map to change values to be as keys
问:
我有一张下面的地图,其中包含该篮子中水果列表的篮子编号。
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
答:
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 })
这样,我们就可以避免创建庞大的项目列表,而是在遍历源映射的同时构建映射。
评论