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

顺便说一句,你说你的元组的第二个元素是 type 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 回答