如何在scala中的两个映射上执行连接和/或组合操作

时间:2015-01-28 06:03:29

标签: scala join

我希望在两张地图中匹配键并生成他们的cogroup的Tuple2。

这样:

val m = Map("a" -> "ma", "b" -> "mb")
val n = Map("b" -> "nb", "a" -> "na" )

val join = m.join(n)
{ b -> ['mb', 'nb'], a -> ['ma', 'na']}

请注意,键的顺序并不重要,但可以根据连接顺序保留值的顺序。

当然可以进行'嵌套循环'操作 - 即取m的每个键并对n进行查找以创建结果。

m.map{ case (k,v) =>
          (k, (v,n(k)))
     }
res4: collection.immutable.Map[String,(String, String)] = Map(a -> (ma,na), b -> (mb,nb))

所以我们可以把它放到一个函数中:

  def join[T <: Comparable[T]](a: Map[T,_], b: Map[T,_]) = {
      a.map{ case (k,v) =>
        (k, (v, b(k)))
      }
  }

尝试一下:

scala> join(m,n)
res7: scala.collection.immutable.Map[String,(Any, Any)] = Map(a -> (ma,na), b -> (mb,nb))

只是想知道是否还有其他方法。

更新是的,这是“合并地图”的副本。

无论如何,最佳答案接近下面接受的答案:

 (a.toSeq++b.toSeq).groupBy(_._1).mapValues(_.map(_._2).toList)

1 个答案:

答案 0 :(得分:4)

你可以这样做

(m.toSeq ++ n.toSeq).groupBy(_._1).mapValues(_.map(_._2))

在这种情况下,m&amp; n不必具有相同的密钥集