我想合并列表中的多个地图。每张地图都有两个键值对。
我有什么......
val input = List[Map[String, String]]
Map[a -> b, c -> d],
Map[a -> b, c -> e],
Map[a -> f, c -> h]
我想要的......
val output = Map[String, List[String]]
Map[b -> (d, e), f -> (h)]
我已经研究过,但我能找到的最接近的是{Scala: Merge maps by key),这不是我想要的场景。理想情况下,我会欣赏一个解释,而不仅仅是一行代码。我知道这可以通过for循环来完成,但我正在尝试学习Scala合并地图的方法。
编辑:在评论中进行了一些讨论后,我决定稍微简化一下这个问题。钥匙' a'和' c'静态/不相关/可以硬编码。目标是制作新地图,其中与关键字' a'将是关键,以及与关键词c'相关的价值。将是价值。制作好所有新地图后,可以将具有相似键的地图组合在一起,并将所有值放在一个列表中。
答案 0 :(得分:1)
好的,试试这个。
val input: List[Map[String, String]] = List( Map("a" -> "b", "c" -> "d")
, Map("a" -> "b", "c" -> "e")
, Map("a" -> "f", "c" -> "h")
)
input.map(m => (m("a"), m("c"))) //List((b,d), (b,e), (f,h))
.groupBy(_._1) //Map(b -> List((b,d), (b,e)), f -> List((f,h)))
.mapValues(_.map(_._2)) //Map(b -> List(d, e), f -> List(h))
答案 1 :(得分:0)
我们的想法是在使用(key, value)
之前首先提取所有groupBy
对,然后最终映射值:
val input: List[Map[String, String]] = ...
val res: Map[String, List[String]] =
input
.flatten // List[(String, String)]
.groupBy { case (k, v) => k } // Map[String, List[(String, String)]]
.mapValues { _.map { case (k, v) => v } } // Map[String, List[String]]