2017-10-03 7 views
4

私はこのような2つのマップを持っているとしましょう。Scalaの2つのマップを交差させて結合/結合する

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)) 
} 

のようなものに頼ることができますしかし、それを行うには、「より多くの慣用的な」方法がないと仮定しますか?私の直感は、私は新しいMapにキーの交差点、その後mapそれらを入手Set

val merged = m1.intersect(m2) 

答えて

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)) 

で得るものに似たものでした。

+0

このソリューションは私の顔を真っ赤にしていました。 :-)パフォーマンスが 'collect'変種とはまったく違うのだろうかと思います。 – andyczerwonka

0

m1m2からListに変換して連結します。その後、キーでグループ化し、必要に応じて結果を変換します。

val allList = m1.toList ++ m2.toList 
val grouped = allList.groupBy(_._1) 
val result = grouped.mapValues(lst => lst.map(_._2)) 
関連する問題