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

How to combine elements of multiple lists in scala

我是 Scala 新手。我有三个列表。

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

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

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

我需要合并这些列表以创建一个看起来应该像这样的列表

List("XX","YY",None,"ZZ")

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

也许你需要这个?

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

对于

val xs = List(list1,list2,list2)

考虑

xs.flatten.distinct

您的列表是 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,你想取第一个。