Bry*_*zer 5 scala scala-collections
我有一系列双打向量: val vectors = Seq[Vector[Double]]
我想对序列中的所有向量求和,即 val total = vectors.sum
例如,如果我有一个包含两个向量[1,2]和的序列[3,4],那么结果应该是[4,6]
但是,该类型的sum方法Vector需要一个隐式的Numeric.
我现在拥有的是:
val total = vectors.reduce( (one,two) => one.zip(two).map(tuple => tuple._1 + tuple._2) )
Run Code Online (Sandbox Code Playgroud)
我是 Scala 的新手,但我觉得这很令人困惑,我认为它可能效率低下。
有一个更好的方法吗?
即使向量具有不同的长度,此尾递归函数也将起作用,并且可以应用于任何数字类型:
@scala.annotation.tailrec
def recSum[T : Numeric](s : Iterable[Iterable[T]]) : List[T] = {
val goodVecs = s.filterNot(_.isEmpty)
if(goodVecs.isEmpty)
List.empty[T]
else
goodVecs.map(_.head).sum :: recSum(goodVecs.map(_.tail))
}
Run Code Online (Sandbox Code Playgroud)
将其应用到您的示例中:
recSum(Seq(Vector(1.0,2.0), Vector(3.0,4.0,5.0))) //List(4.0,6.0,5.0)
recSum(Seq.empty[Vector[Double]]) // List()
Run Code Online (Sandbox Code Playgroud)