2013-02-22 213 views
0

我是scala的新手,不知道該怎麼做。 我有這樣的元組的3名名單:將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")] 

列表中可以有不同.size和可選字段有時是空的。 現在我想這3個列表組合成「resultlist」 - 這將是這樣的:

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

這可能看起來像

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

是否有可能清單合併成這樣?

在此先感謝

回答

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

順便說一句,你說你的元組的第二個元素是Option[String]型的,但是從示例列表你發佈的情況並非如此:空字符串與None不一樣。 所以我認爲elemnt的類型實際上是(String, String)(可能爲空字符串)而不是(String, Option[String])。 如果事實上的類型真的是(String, Option[String])(意思是你的榜樣名單應該是沿着List(("a",Some("1aa2")),("b",None),("c",Some("1yy2"))線以上),那麼您必須在我的代碼片段上方改變是使用無作爲裏邊反默認值:

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)) } 
+0

適合100%!謝謝你,先生! – RohbRoy 2013-02-22 17:46:54

+0

是的,類型是Option [String](該列表通過SQL填充)我將編輯我的文章 – RohbRoy 2013-02-22 18:01:53

2
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) 
+0

嘿,我認爲這會幫助我很多! (c,1xx2),(c,1yy2))) (a,List((a,1aa2),(a,1ab2),(a,1ab2) )) (b,List((b,1bb2),(b,),(b,1bb2)))'我怎麼能讀取關於「a」的所有字符串或簡單地從第二列開始的所有字符串...對不起即時通訊真的是新來的斯卡拉,並在這之前在java中的陣列工作 – RohbRoy 2013-02-22 17:31:34

+0

我剛剛編輯我的答案,完全適合您的需求 – maxmc 2013-02-22 17:34:30

+0

我很驚訝這被接受,因爲問題要求最終列表中的元素存儲爲元組4)。我猜OP不知道他是否想要元組或列表......?編輯:哎呀,接受的解決方案再次改變^^ – 2013-02-22 17:43:46

-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 
+0

這將只是將所有元組粘貼到一個新的列表 - 我需要的是具有不同(更大)元組的列表 - 其中正常的「String」元素只顯示一次 – RohbRoy 2013-02-22 17:17:52

相關問題