关于合并两个元组的操作

时间:2018-06-28 07:20:26

标签: scala merge tuples

现在有两个元组。

1st tuple:((A,1),(B,3),(D,5)......)
2nd tuple:((A,3),(B,1),(E,6)......)

功能是将这两个元组合并到此。

((A,1,3),(B,3,1),(D,5,0),(E,0,6)......)

如果第一个元组包含不在第二个元组中的键,则将该值设置为0,反之亦然。如何在Scala中编写此函数的代码?

2 个答案:

答案 0 :(得分:0)

假设您输入的格式为

val tuple1: List[(String, Int)] = List(("A",1),("B",3),("D",5),("E",0))
val tuple2: List[(String, Int)] = List(("A",3),("B",1),("D",6))

您可以将合并功能编写为

def merge(tuple1: List[(String, Int)],tuple2: List[(String, Int)]) =
{
  val map1 = tuple1.toMap
  val map2 = tuple2.toMap

  map1.map{ case (k,v) =>
    (k,v,map2.get(k).getOrElse(0))
  }
}

调用函数

merge(tuple1,tuple2)

您将得到的输出为

res0: scala.collection.immutable.Iterable[(String, Int, Int)] = List((A,1,3), (B,3,1), (D,5,6), (E,0,0))

请让我知道是否能回答您的问题。

答案 1 :(得分:0)

val t1= List(("A",1),("B",3),("D",5),("E",0))
val t2= List(("A",3),("B",1),("D",6),("H",5))
val t3 = t2.filter{ case (k,v) => !t1.exists(case (k1,_) => k1==k)) }.map{case (k,_) => (k,0)}
val t4 = t1.filter{ case (k,v) => !t2.exists{case (k1,_) => k1==k} }.map{case (k,_) => (k,0)}
val t5=(t1 ++ t3).sortBy{case (k,v) => k}
val t6=(t2 ++ t4).sortBy{case (k,v) => k}
t5.zip(t6).map{case ((k,v1),(_,v2)) => (k,v1,v2) }
res: List[(String, Int, Int)] = List(("A", 1, 3), ("B", 3, 1), ("D", 5, 6), ("E", 0, 0), ("H", 0, 5))

就这里发生的事情而言 t3和t4-分别在t1和t2中找到缺失值,并将它们添加为零值 t5和t6对统一列表进行排序(t1和t3以及t2和t4)。最后,将它们压缩在一起并转换为所需的输出