将3个元组列表组合成一个新列表

时间:2013-02-22 16:54:44

标签: scala

我是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个List组合成一个“结果列表” - 看起来像这样:

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

可能看起来像

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

是否可以组合这样的列表?

提前致谢

3 个答案:

答案 0 :(得分: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]类型,但是你发布的示例列表不是这样的:空字符串与{{1}不同}。 所以我假设elemnt的类型实际上是None(可能是空字符串)而不是(String, String)。 如果实际上类型确实是(String, Option[String])(意味着您的示例列表应该更像(String, Option[String])),那么您在上面的代码片段中所需要更改的是使用None作为默认值值:

List(("a",Some("1aa2")),("b",None),("c",Some("1yy2"))

答案 1 :(得分: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) 

答案 2 :(得分:-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