3

我有一个值列表,并希望将其减少为连续成员之间的差异列表。有没有比我想出的更好的方法(简单的例子)?

val l1 = List(1,2,3,4,5,6)

val diffs = (l1 zip l1.drop(1)).map{case (x,y) => y - x}.sum
4

3 回答 3

9

我确定我以前回答过一个非常相似的问题,但我找不到。无论如何,尝试一下zipped,因为它更有效并提供更好的语法:

(l1 drop 1, l1).zipped.map(_-_).sum
于 2013-11-12T16:13:08.073 回答
5

我喜欢sliding用于这个用例:

val l1 = List(1,2,3,4,5,6)
val diffs = l1.sliding(2).map{case List(x, y) => x - y}.sum

在这里试试。

于 2013-11-12T15:35:55.097 回答
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
于 2013-11-12T15:35:42.233 回答