0

私はscalaが初めてで、ここで何をすべきかわかりません。次のようなタプルの 3 つのリストがあります。

List1 = List[(String,Option[String])]
List2 = List[(String,Option[String])]
List3 = List[(String,Option[String])]

リスト内の要素は次のようになります。

List1 = List[("a","1aa2"),("b","1bb2"),("c","1xx2")]
List2 = List[("a","1aa2"),("b",None),("c","1yy2")]
List3 = List[("a","1aa2"),("b","1bb2")]

List の .size が異なる場合があり、Optional フィールドが空の場合があります。ここで、これら 3 つのリストを「結果リスト」に結合したいと思います。これは次のようになります。

Listresult = List[(String,Option[String],Option[String],Option[String])]

次のように見える可能性があります

Listresult = List[
("a" , "1aa2"  ,"1aa2" , "1aa2"),
("b" , "1bb2"  ,  ""   , "1bb2"),
("c" , "1xx2"  ,"1yy2" ,   ""  )]

そのようなリストを結合することは可能ですか?

前もって感謝します

4

3 に答える 3

5
val map1 = list1.toMap.withDefaultValue("")
val map2 = list2.toMap.withDefaultValue("")
val map3 = list3.toMap.withDefaultValue("")
val keys = List(list1, list2, list3).flatMap(_.map(_._1)).distinct
val resultList = keys.map{k => (k, map1(k), map2(k), map3(k)) }

ところで、タプルの 2 番目の要素のタイプは であると言いますが、Option[String]投稿したリストの例からはそうではありません。空の文字列は と同じではありませんNone。したがって、要素のタイプは実際には(String, String)(空の文字列の可能性がある)ではなく(String, Option[String]). 実際にタイプが実際にある場合(String, Option[String])(つまり、リストの例が の行に沿っている必要があることを意味しますList(("a",Some("1aa2")),("b",None),("c",Some("1yy2")))、上記のコード スニペットで変更する必要があるのは、デフォルト値として None を使用することだけです。

val map1 = list1.toMap.withDefaultValue(None)
val map2 = list2.toMap.withDefaultValue(None)
val map3 = list3.toMap.withDefaultValue(None)
val keys = List(list1, list2, list3).flatMap(_.map(_._1)).distinct
val resultList = keys.map{k => (k, map1(k), map2(k), map3(k)) }
于 2013-02-22T17:35:25.190 に答える
3
val list1 = List(("a","1aa2"),("b","1bb2"),("c","1xx2"))
val list2 = List(("a","1ab2"),("b",""),("c","1yy2"))
val list3 = List(("a","1ab2"),("b","1bb2"))

val combined = list1 ::: list2 ::: list3

これはあなたが実際に望むフォーマットだと思います:

//List((a,List(1aa2, 1ab2, 1ab2)), (b,List(1bb2, "", 1bb2)), (c,List(1xx2, 1yy2)))

val result = combined.groupBy(_._1).map { x =>
       (x._1, x._2.map { y =>
        y._2
       })
   }.toList.sortBy(_._1)   

でも本当に欲しいなら

//List(List(a, 1aa2, 1ab2, 1ab2), List(b, 1bb2,"", 1bb2), List(c, 1xx2, 1yy2))

次に、次を使用できます。

val result = combined.groupBy(_._1).map { x =>
    (x._1, x._1 :: x._2.map { y => y._2 })
  }.toList.sortBy(_._1).map(_._2) 
于 2013-02-22T17:08:03.730 に答える
-1

あなたができるlist1 ::: list2 ::: list3

次のようになります。

val list1 = List(("a","1aa2"),("b","1bb2"),("c","1xx2"))
val list2 = List(("a","1ab2"),("b",""),("c","1yy2"))
val list3 = List(("a","1ab2"),("b","1bb2"))

val result = list1 ::: list2 ::: list3
于 2013-02-22T17:10:20.883 に答える