Baby Kotlin开发人员在这里:)
考虑以下结构:
[
{ "color": ["red", "blue"] },
{ "color": ["red", "green"] },
{ "shape": ["square", "circle"] },
{ "shape": ["rectangle"] }
]
我想获得键和它们各自的值合并的以下结果:
[
{ "color": ["red", "blue", "green"] },
{ "shape": ["square", "circle", "rectangle"] }
]
经过研究,我想到的是这样的东西(无法工作/编译),但是我缺少了一些东西:
val colors1 = mapOf("color" to listOf("red", "blue"))
val colors2 = mapOf("color" to listOf("red", "green"))
val shapes1 = mapOf("color" to listOf("square", "circle"))
val shapes2 = mapOf("color" to listOf("rectangle"))
var mainList = mutableListOf(colors1, colors2, shapes1, shapes2)
mainList.reduce { acc, it -> (acc.asSequence() + it.asSequence())
.distinct()
.groupBy({it.key}, {it.value})
.mapValues { (_, values) -> values.flatten().distinct() }
任何帮助将不胜感激。
答案 0 :(得分:1)
您可以将reduce
与地图flatMap
结合使用,而不是将地图与entries
合并。所以它应该这样工作:
mainList
.flatMap { it.entries }
.groupBy({ it.key }, { it.value })
.mapValues { (_, values) -> values.flatten().toSet() }
另外,更有效地平整最后一行中的值的方法是:
.mapValues { (_, values) -> values.flatMapTo(mutableSetOf()) { it } }
这消除了为存储flatten()
和distinct()
/ toSet()
之间的值而创建的中间集合的开销,但仍确保了这些项是唯一的,因为它们被添加到了mutableSet()
。
重新分配mainList
:(link)