合并多个地图并将值保留在列表中

时间:2017-03-19 03:28:33

标签: scala merge hashmap

我想合并列表中的多个地图。每张地图都有两个键值对。

我有什么......

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'相关的价值。将是价值。制作好所有新地图后,可以将具有相似键的地图组合在一起,并将所有值放在一个列表中。

2 个答案:

答案 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. 检索值并将它们放入元组
  2. 使第一个元素成为元组的键
  3. 通过提取第二个元素来取消元组

答案 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]]