我有一个值列表,并希望将其减少为连续成员之间的差异列表。有没有比我提出的更好的方法(琐碎的例子)?
val l1 = List(1,2,3,4,5,6)
val diffs = (l1 zip l1.drop(1)).map{case (x,y) => y - x}.sum
答案 0 :(得分:9)
我确定我之前已经回答了一个类似的问题,但我找不到它。无论如何,尝试zipped
,因为它更有效,并提供更好的语法:
(l1 drop 1, l1).zipped.map(_-_).sum
答案 1 :(得分:5)
我喜欢在这个用例中使用sliding
:
val l1 = List(1,2,3,4,5,6)
val diffs = l1.sliding(2).map{case List(x, y) => x - y}.sum
试试here。
答案 2 :(得分:1)
你可以使用滑动
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