减去相邻的列表元素

时间:2015-08-06 06:41:39

标签: scala

我的scala列表包含以下元素:

val A = List(12,1,34,34,45,56,7)

现在我想减去列表如下:

  List((12-1),(1-34),(34-34),(34-45),(45-56),(56-7))

所以最后的结果将是:

val result = List(11,-33,0,-11,-11,49)

6 个答案:

答案 0 :(得分:5)

我认为你需要sliding(通过传递"滑动窗口"对它们进行固定大小的块组合):

A.sliding(2,1).toList.map(x => x(0) - x(1))

答案 1 :(得分:3)

让我们不要忘记zipped

val A = List(12,1,34,34,45,56,7)
(A,A.drop(1)).zipped.map(_-_)

答案 2 :(得分:2)

只需再添加一个选项:

(A zip A.drop(1)).map({ case (a, b) => a - b })

这比sliding提供了更多的类型安全性,因为Tuple2编纂了中间集合的元素是成对的事实。

答案 3 :(得分:1)

你可以这样做:

val list = List(12, 1, 34, 45)
list.sliding(2).map {
 case a :: b :: Nil => a - b
}.toList

它应该返回你需要的东西。

答案 4 :(得分:0)

我对zip / map解决方案的性能印象不深。这个可以用简单的迭代器来完成,覆盖next()方法。但我更喜欢溪流

def subNeighbours(xs: List[Int]): Stream[Int] = xs match {
  case x :: y :: rest => (x - y) #:: subNeighbours(y :: rest)
  case _ => Stream.Empty
}

(subNeighbours(A)).toList

输入和输出:

  • List(12, 1, 34, 34, 45, 56, 7) => List(11, -33, 0, -11, -11, 49)
  • List(1, 3, 2, 9, 0, 5) => List(-2, 1, -7, 9, -5)
  • List(1) => List()
  • List() => List()

流解决方案只遍历列表一次。

答案 5 :(得分:-2)

嗯,这背后的想法是:

for(int i=0; i<list.length-1; i++){
list[i]= list[i]-list[i+1];
}

现在只需添加小垃圾细节,例如将结果设置为最终值,您就是金色的。