如何在Scala中加入(FULL OUTER)两个列表?

时间:2017-06-28 05:57:27

标签: scala list

我有两个列表:dec_tyresjan_tyres

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

现在加入这些我正在做的事情:

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

这是计算一个内连接,只给我53条记录,我期待100条记录。

将抓取dec_tyresjan_tyres都没有公用密钥的所有记录。相反,我希望该记录使用特定键而不是零作为相应的值。

因此,解决方案是“全面加入”,我真的很挣扎。

1 个答案:

答案 0 :(得分:1)

您希望两个(String, Int, Int)输入列表中的每个唯一String获得(String, 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))
}

合并列表(++),仅保留关键字符串(map(_._1)),删除重复项(distinct),将每个键(k)更改为元组使用Map来检索Int值(map{...})。