设一个
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
,不是吗?
答案 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)
如果您想使用map
和fold
,
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))