scala结合多个序列

时间:2018-04-01 17:31:39

标签: scala functional-programming combinations sequence

我有几个列表:

ENCODE('pass','salt')

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

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

但是我的zip和flatMap的组合

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

只生产

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

在java中,我只是迭代(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) ,然后再在嵌套循环中迭代值。

使用整齐的功能scala,我需要更改以获得所需格式的数据?

3 个答案:

答案 0 :(得分:3)

这个怎么样:

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

我怀疑这可以做得更整洁更好功能

答案 1 :(得分:1)

阅读并不完美,但这里有一个选项:

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

答案 2 :(得分:0)

使用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))