如何在scala中组合多个列表的元素

时间:2015-09-29 10:52:46

标签: scala scala-collections

我是Scala的新手。我有三个List。

List("XX", None,None,None)

List( None,"YY",None,None)

List(None,None,None, "ZZ")

我需要合并这些列表来创建一个看起来像

的列表
List("XX","YY",None,"ZZ")

scala有什么办法可以达到这个效果吗?感谢

4 个答案:

答案 0 :(得分:5)

也许你需要这个?

val list: List[List[Option[String]]] = List(
  List(Some("XX"), None, None, None),
  List(None, Some("YY"), None, None),
  List(None, None, None, Some("ZZ"))
)
list.tail.foldLeft(list.head) {
  case (acc, item) => acc.zip(item).map {
    case (Some(x), _) => Some(x)
    case (_, y) => y
  }
}

答案 1 :(得分:3)

您的列表是List[AnyRef]。这是一种永远不会出现在普通Scala代码中的类型。

我建议使用List[Option[String]]代表您的数据:

scala> List(List(Some("XX"), None, None, None),
     |      List(None, Some("YY"), None, None),
     |      List(None, None, None, Some("ZZ")))
res2: List[List[Option[String]]] = List(...

现在您的问题很容易解决:

scala> res2.transpose.map(_.flatten.headOption)
res6: List[Option[String]] = List(Some(XX), Some(YY), None, Some(ZZ))

我在这里假设,如果同一位置有多个Some,你想拿第一个。

答案 2 :(得分:2)

val l1 = List("XX", None, None, None)
val l2 = List(None, "YY", None, None)
val l3 = List(None, None, None, "ZZ")

val listOfList = List(l1, l2, l3) 

// Assuming all lists are of same length.

val lT = listOfList.transpose  // swap column and rows
val result = lT.map{ _.reduce{ (a, b) => 
  if (a.toString == "None") b else a
}}
// List[Serializable] = List(XX, YY, None, ZZ)

答案 3 :(得分:2)

对于

val xs = List(list1,list2,list2)

考虑

xs.flatten.distinct