【问题标题】:scala combining multiple sequences结合多个序列的scala
【发布时间】:2018-04-01 17:31:38
【问题描述】:

我有几个列表:

val aa = Seq(1,2,3,4)
val bb = Seq(Seq(2.0,3.0,4.0,5.0), Seq(1.0,2.0,3.0,4.0))
val cc = Seq("a", "B")

并希望将它们组合成所需的格式:

(1, 2.0, a), (2, 3.0, a), (3, 4.0, a), (4, 5.0, a), (1, 1.0, b), (2, 2.0, b), (3, 3.0, b), (4, 4.0, b)

但是我的 zip 和 flatMap 的组合

(aa, bb,cc).zipped.flatMap{
  case (a, b,c) => {
    b.map(b1 => (a,b1,c))
  }
}

只生产

(1,2.0,a), (1,3.0,a), (1,4.0,a), (1,5.0,a), (2,1.0,B), (2,2.0,B), (2,3.0,B), (2,4.0,B)

在 java 中,我将只迭代 bb,然后再次在嵌套循环中迭代值。

为了使用简洁的函数式 scala 获得所需格式的数据,我需要进行哪些更改?

【问题讨论】:

    标签: scala functional-programming combinations sequence


    【解决方案1】:

    这个怎么样:

    for {
      (bs, c) <- bb zip cc
      (a, b) <- aa zip bs
    } yield (a, b, c)
    

    生产:

    List(
      (1,2.0,a), (2,3.0,a), (3,4.0,a), (4,5.0,a), 
      (1,1.0,b), (2,2.0,b), (3,3.0,b), (4,4.0,b)
    )
    

    我怀疑这是否可以变得更加整洁和实用。

    【讨论】:

      【解决方案2】:

      读起来不太漂亮,但这里有一个选项:

      bb
        .map(b => aa.zip(b)) // List(List((1,2.0), (2,3.0), (3,4.0), (4,5.0)), List((1,1.0), (2,2.0), (3,3.0), (4,4.0)))
        .zip(cc) // List((List((1,2.0), (2,3.0), (3,4.0), (4,5.0)),a), (List((1,1.0), (2,2.0), (3,3.0), (4,4.0)),B))
        .flatMap{ case (l, c) => l.map(t => (t._1, t._2, c)) } // List((1,2.0,a), (2,3.0,a), (3,4.0,a), (4,5.0,a), (1,1.0,B), (2,2.0,B), (3,3.0,B), (4,4.0,B))
      

      【讨论】:

        【解决方案3】:

        使用collectmap 的另一种方法

        scala> val result = bb.zip(cc).collect{
          case bc => (aa.zip(bc._1).map(e => (e._1,e._2, bc._2)))
        }.flatten
        result: Seq[(Int, Double, String)] = List((1,2.0,a), (2,3.0,a), (3,4.0,a), (4,5.0,a), (1,1.0,B), (2,2.0,B), (3,3.0,B), (4,4.0,B))
        

        【讨论】:

          猜你喜欢
          • 2013-02-09
          • 1970-01-01
          • 2015-08-13
          • 1970-01-01
          • 2019-09-06
          • 2016-07-08
          • 2018-02-21
          • 2019-02-09
          • 1970-01-01
          相关资源
          最近更新 更多