我有一个值列表,并希望将其减少为连续成员之间的差异列表。有没有比我想出的更好的方法(简单的例子)?
val l1 = List(1,2,3,4,5,6)
val diffs = (l1 zip l1.drop(1)).map{case (x,y) => y - x}.sum
我有一个值列表,并希望将其减少为连续成员之间的差异列表。有没有比我想出的更好的方法(简单的例子)?
val l1 = List(1,2,3,4,5,6)
val diffs = (l1 zip l1.drop(1)).map{case (x,y) => y - x}.sum
我确定我以前回答过一个非常相似的问题,但我找不到。无论如何,尝试一下zipped
,因为它更有效并提供更好的语法:
(l1 drop 1, l1).zipped.map(_-_).sum
我喜欢sliding
用于这个用例:
val l1 = List(1,2,3,4,5,6)
val diffs = l1.sliding(2).map{case List(x, y) => x - y}.sum
在这里试试。
你可以使用滑动
l1.sliding(2).map { case Seq(a, b) => b - a } .sum
但这并没有更短。此外,如果你有一个列表,你可以使用l1.tail
而不是l1.drop(1)
.
我曾经写过以下扩展方法:
import collection.generic.CanBuildFrom
implicit final class RichIterableLike[A, CC[~] <: Iterable[~]](val it: CC[A])
extends AnyVal {
def mapPairs[B, To](fun: (A,A)=>B)(implicit cbf: CanBuildFrom[CC[A], B, To]): To = {
val b = cbf(it)
val iter = it.iterator
if (iter.hasNext) {
var pred = iter.next()
while (iter.hasNext) {
val succ = iter.next()
b += fun(pred, succ)
pred = succ
}
}
b.result()
}
}
接着就,随即:
l1.mapPairs(-_+_).sum