我是Scala的新手。我有三个List。
List("XX", None,None,None)
List( None,"YY",None,None)
List(None,None,None, "ZZ")
我需要合并这些列表来创建一个看起来像
的列表List("XX","YY",None,"ZZ")
scala有什么办法可以达到这个效果吗?感谢
答案 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