2017-06-28 7 views
1

私は2つのリストがあります:私を与えるScalaの2つのリストに(FULL OUTER)参加するには?

val mb = jan_tyres.toMap 
val tyres_count = dec_tyres.flatMap{case (ka,va) => mb.get(ka).map(vb => (ka,va,vb))}.toList 

を::

scala> tyres_count 
res23: List[(String, Int, Int)] = List((007139::21,10,8), ..... 

scala> tyres_count.length 
res24: Int = 53 

これは、内部の計算された私がやっているこれらに参加するために今すぐ

scala> dec_tyres 
res21: List[(String, Int)] = List((007139::21,10), ..... 

scala> jan_tyres 
res22: List[(String, Int)] = List((005179::24,2), ..... 

scala> dec_tyres.length 
res19: Int = 71 

scala> jan_tyres.length 
res20: Int = 82 

dec_tyresjan_tyresを参加して私には53のレコードしか与えませんでした。ここで私は100レコードを期待しています。

dec_tyresjan_tyresの両方に共通鍵がないすべてのレコードが削られます。その代わりに、それぞれの値として0を使用せずに、特定のキーを使用してレコードを欲しいと思います。

したがって、解決策は「完全な外部結合」です。これは本当に苦労しています。

+0

これをhttps://stackoverflow.com/help/mcveに変換できますか?私は、そのリストの型シグネチャが(String、Int)であることに少しは関心があります。明示的に型指定された変数でクリアできるような、非常に奇妙な型変換が起こっています。 –

+0

@RyanTheLeachあなたが仲良くなっていない。 List(String、Int)型のリストが2つあります。文字列がキーです。 List(String、Int、Int)をフォームに結合したいと思います。そして、この結合は完全な外部結合でなければなりません。 –

+0

あなたのString/id/keyは真剣に "007139 :: 21"という形式ですか?それは混乱していて、「短所」のように見えます。 –

答えて

1

2つの(String, Int)入力リストのすべてのユニークStringの結果が(String, Int, Int)になりますか?

val janMap = jan_tyres.toMap // for fast lookup 
val decMap = dec_tyres.toMap 

val tyres_count = (jan_tyres ++ dec_tyres).map(_._1).distinct.map{ k => 
    (k, decMap.getOrElse(k, 0), janMap.getOrElse(k, 0)) 
} 

Int値(map{...})を取得するためにMap Sを使用してタプルに各キー(k)を変更、重複(distinct)を削除し、唯一のキー文字列(map(_._1))を維持、(++)のリストを組み合わせます。

+0

最後の地図を説明できますか? –

+0

拡張された説明が追加されました。 – jwvh

+0

私はこの回答をステップに分割しましたが、それを動作させることができませんでした。 エラー:異なる(10、35)の値は、1月++ 12月中間 ^ intermediate.distinct遅延ヴァル別個scala.collection.immutable.Map [文字列、INT]のメンバー=ではありません。 map(_. 1) –

関連する問題