我的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)
答案 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];
}
现在只需添加小垃圾细节,例如将结果设置为最终值,您就是金色的。