如何拉链而不是成对?

时间:2018-01-20 20:15:46

标签: scala

设一个

Seq( Seq(1, 2, 5) , Seq(3, 4, 5) , Seq(2, 1, 0) )

我想得到:

Seq( Seq(1, 3, 2) , Seq(2, 4, 1) , Seq(5, 5, 0) )

目前我写了这个:

points.reduce((point_1, point_2) => point_1.zip(point_2))

使用points Seq[Seq[Double]]point_1以及point_2 Seq[Double]

它返回一个错误,因为Scala的解释器似乎尝试与Seq[(Double, Double)]Double建立配对(我认为)。在我的示例中,它尝试与Seq( (1, 3) )2配对。我错了,但这是我现在对这个问题的解释。

那么,如何解决这个bug呢?我觉得我需要使用flatten,不是吗?

2 个答案:

答案 0 :(得分:4)

标准库可以为您做到这一点。

Seq( Seq(1, 2, 5) , Seq(3, 4, 5) , Seq(2, 1, 0) ).transpose
//res0: Seq[Seq[Int]] = List(List(1, 3, 2), List(2, 4, 1), List(5, 5, 0))

<强>更新

如果您打算以功能性的方式自己做,这是单向的。

val ssi: Seq[Seq[Int]] = Seq(Seq(1, 2, 5), Seq(3, 4, 5), Seq(2, 1, 0))

ssi.zipWithIndex.map{case (s,x) =>
  s.indices.map(ssi(_)(x))
}

答案 1 :(得分:1)

如果您想使用mapfold

进行此操作
val seqInput = Seq( Seq(1, 2, 5) , Seq(3, 4, 5) , Seq(2, 1, 0) )
// seqInput: Seq[Seq[Int]] = List(List(1, 2, 5), List(3, 4, 5), List(2, 1, 0))

val seqOutput = seqInput
  .map(s => Seq(s))
  .fold(
    seqInput.head.map(_ => Seq.empty[Int])
  )({
    case (acc, seq) => acc.zipWithIndex.map({ case (accSeq, i) => accSeq :+ seq.head(i) })
  })
// seqOutput: Seq[Seq[Int]] = List(List(1, 3, 2), List(2, 4, 1), List(5, 5, 0))