【问题标题】:The operation about Merge two tuples合并两个元组的操作
【发布时间】:2018-12-07 04:25:51
【问题描述】:

现在有两个这样的元组。

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 中编写此函数?

【问题讨论】:

标签: scala merge tuples


【解决方案1】:

假设您以格式获取输入

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

如果这回答了您的问题,请告诉我。

【讨论】:

    【解决方案2】:
    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)。最后将它们压缩在一起并转换为所需的输出

    【讨论】:

      猜你喜欢
      • 2018-03-08
      • 2020-02-19
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2013-09-01
      • 2012-10-15
      • 2023-01-24
      • 2020-06-18
      相关资源
      最近更新 更多