【问题标题】:How to combine elements of multiple lists in scala如何在scala中组合多个列表的元素
【发布时间】:2015-09-29 10:52:46
【问题描述】:

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

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

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

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

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

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

scala 有什么方法可以实现这个结果吗?谢谢

【问题讨论】:

  • 顺序重要吗?类型总是 String 还是 None?

标签: scala scala-collections


【解决方案1】:

也许你需要这个?

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

【讨论】:

  • 折叠函数可以是{ case (a, x) => (a, x).zipped map { case (y, z) => y orElse z } },其中压缩避免中间集合。
【解决方案2】:

您的列表是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))

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

【讨论】:

    【解决方案3】:
    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)
    

    【讨论】:

    • 以这种方式测试None 尤其严格(即不好)。糟糕透顶。
    • @som-snytt 点已接受。但从给定的数据开始,它是实现结果的一种方式。其他人指出起点应该是选项列表。我同意。
    【解决方案4】:

    对于

    val xs = List(list1,list2,list2)
    

    考虑

    xs.flatten.distinct
    

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 2017-08-09
      • 2021-11-26
      • 1970-01-01
      • 2021-10-31
      • 2020-05-22
      • 2013-04-14
      • 2020-07-19
      • 2016-10-08
      相关资源
      最近更新 更多