合并地图列表(字符串列表)

时间:2019-05-31 14:47:34

标签: kotlin functional-programming

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() }

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以将reduce与地图flatMap结合使用,而不是将地图与entries合并。所以它应该这样工作:

mainList
    .flatMap { it.entries }
    .groupBy({ it.key }, { it.value })
    .mapValues { (_, values) -> values.flatten().toSet() }

(runnable sample)

另外,更有效地平整最后一行中的值的方法是:

    .mapValues { (_, values) -> values.flatMapTo(mutableSetOf()) { it } }

这消除了为存储flatten()distinct() / toSet()之间的值而创建的中间集合的开销,但仍确保了这些项是唯一的,因为它们被添加到了mutableSet()


重新分配mainList(link)

的示例