我希望在两张地图中匹配键并生成他们的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)
答案 0 :(得分:4)
你可以这样做
(m.toSeq ++ n.toSeq).groupBy(_._1).mapValues(_.map(_._2))
在这种情况下,m&amp; n不必具有相同的密钥集