Операция о слиянии двух кортежей - PullRequest
0 голосов
/ 28 июня 2018

Теперь есть два таких кортежа.

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 голосов
/ 28 июня 2018
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). Наконец, они объединяются и преобразуются в желаемый результат

0 голосов
/ 28 июня 2018

Допустим, вы получаете ввод в формате

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

Пожалуйста, дайте мне знать, если это отвечает на ваш вопрос.

...