Scala中的交叉点和合并/连接两个地图

时间:2017-10-03 20:00:45

标签: scala

我们说我有两张看起来像这样的地图。

val m1 = Map(1 -> "One", 2 -> "Two", 3 -> "Three")
val m2 = Map(2 -> 2.0, 3 -> 3.0, 4 -> 4.0)

我想基于键获取交集并返回表示合并值的元组。结果看起来像这样。

Map(2 -> (Two,2.0), 3 -> (Three,3.0))

我想我可以诉诸

之类的东西
val merged = m1 collect {
  case (key, value) if m2.contains(key) => key -> (value, m2(key))
}

但是没有更多的惯用语"这样做的方法?我的直觉与我Set

的相似之处
val merged = m1.intersect(m2)

2 个答案:

答案 0 :(得分:5)

m1.keySet.intersect(m2.keySet).map(k => k->(m1(k),m2(k))).toMap
// res0: Map[Int,(String, Double)] = Map(2 -> (Two,2.0), 3 -> (Three,3.0))

获取密钥的交集,然后map将它们转换为新的Map

答案 1 :(得分:0)

m1m2转换为List并连接。然后按键分组并根据需要转换结果

val allList = m1.toList ++ m2.toList
val grouped = allList.groupBy(_._1)
val result = grouped.mapValues(lst => lst.map(_._2))