【问题标题】:Merging multiple maps and keeping the values in a list合并多个地图并将值保存在列表中
【发布时间】:2021-07-23 03:59:17
【问题描述】:

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

我有什么...

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 合并地图的方式。

编辑:在 cmets 中进行了一些讨论后,我决定稍微简化一下这个问题。键“a”和“c”是静态的/不相关的/可以硬编码。

目标是制作新地图,其中与键“a”关联的值将成为键,与键“c”关联的值将成为值。制作完所有新地图后,可以将具有相似键的地图组合在一起,并将它们的所有值放在一个列表中。

【问题讨论】:

  • 为什么f 成为键,h 成为值,而不是相反? Maps 根据定义是无序的,因此您需要指定使用哪些规则来确定哪个值成为键以及哪个值成为值列表的成员。
  • 许多 'f' 值(或 b)是重复的,因此将它们设为键更简洁。所有的“h”值(或 d/e)都是唯一的,因此可以将它们分组在一个列表中。
  • 很抱歉删除评论,那是个意外。好的,我现在明白了。谢谢你的解释。
  • @Tanjin 没问题
  • 我还是没看到。 defh 在示例中都是唯一的,但由于某种原因,f 应该成为键,而其他的则被收集到 List 值中。这是什么逻辑?

标签: scala merge hashmap


【解决方案1】:

这个想法是在使用groupBy之前首先提取所有(key, value)对,最后映射值:

val input: List[Map[String, String]] = ...

val res: Map[String, List[String]] =
  input
    .flatten                        // List[(String, String)]
    .groupBy { case (k, _) => k }   // Map[String, List[(String, String)]]
    .mapValues(_.map { case (_, v) => v })   // Map[String, List[String]]
    

【讨论】:

  • 请注意mapValues 返回一个惰性集合!
【解决方案2】:

好的,试试这个。

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. 通过提取第二个元素来取消元组

【讨论】:

  • 这行得通!我了解每个步骤中发生的情况(感谢您的嵌入式 cmets),但是我在哪里可以了解更多关于您在括号内使用的符号的信息?例如,我不明白这是什么意思:(_._1)
  • @DWilliams,第一个下划线是传递给匿名函数 (lambda) 的参数的简写,即当前集合的每个元素的替代项(例如 ListMap )。第二个带数字的下划线是访问/提取元组元素的机制。提到了herehere
猜你喜欢
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2017-12-25
  • 2012-03-21
相关资源
最近更新 更多