2017-06-03 9 views
2

Scalaで2つのリストをペアにしようとすると、一致しないペアをデフォルト値に置き換える必要があります。 。不足している長さのリストと不一致のデフォルト値のマージ

List((a、a)、(b、empty)、(c、c))を作成するにはどうすればよいですか?

case class Test(id: Option[Int] = None) 
val empty = Test() 
val a = Test(Some(1)) 
val b = Test(Some(2)) 
val c = Test(Some(3)) 

val cache = List(a,b,c) 
val delta = List(a,c) 

//Trial 1 
val newCache1 = cache.zipAll(delta,empty,empty) 

//Tial 2 
val newCache2 = for { 
    c <- cache 
    d <- delta 
    if c.id == d.id 
} yield (c,d) 

//Tial 3 
val newCache3 = for { 
    c <- cache 
    d <- delta 
} yield if (c.id == d.id) (c,d) else (c,empty) 
+0

重複はありますか?リストは注文されていますか?あなたは地図にデルタを入れ、その中からペアを選ぶことができます。 – Stephen

答えて

1
それらを結合し、その後、マップにあなたのデルタを回し

val deltaMap: Map[Int, Test] = 
    delta.flatMap(x => x.id.map(id => id -> x)).toMap 

    val newCache: Seq[(Test, Test)] = cache.map { c => 
    c -> c.id.flatMap(deltaMap.get).getOrElse(empty) 
    }