获取列表成员之间的差异

时间:2013-11-12 15:27:51

标签: scala collections

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

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

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

3 个答案:

答案 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