2013-02-22 212 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

相关问题