Scala 减去相邻的列表元素

Scala 减去相邻的列表元素,scala,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) 这背后的想法是: for(int i=0; i<list.length-1; i++){ list[i]= list[i]-list[i+1]; } fo

我的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)

这背后的想法是:

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

for(inti=0;i好吧,这背后的思想是:

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

对于(int i=0;i我认为您需要滑动(通过在元素上传递一个“滑动窗口”将元素分组为固定大小的块):


我认为您需要滑动(在固定大小的块上通过“滑动窗口”对元素进行分组):

你可以做:

val list = List(12, 1, 34, 45)
list.sliding(2).map {
 case a :: b :: Nil => a - b
}.toList
它应该会返回您需要的内容。

您可以执行以下操作:

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

它应该会返回您需要的内容。

只需在混合中添加一个选项:

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

这比滑动的类型安全性要多一点,因为Tuple2编码了中间集合的元素是成对的这一事实。

只需在混合中添加一个选项:

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

这比滑动的类型安全性要多一点,因为Tuple2编码了中间集合的元素是成对的这一事实。

我们不要忘记压缩的

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

让我们不要忘记
zipped

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

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
投入和产出:

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

Stream solution只遍历列表一次。

我对zip/map解决方案的性能没有印象。这可以通过一个简单的迭代器完成,覆盖
next()
方法。但我更喜欢streams

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

(subNeighbours(A)).toList
投入和产出:

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

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

1
是默认步骤,因此
滑动(2)
就足够了。单例列表有问题。您需要在
映射之前添加
.filter({.size>1)
,或者将
映射替换为
。收集{case list(x,y)=>x-y}
A.slideing(2).map(u.reduce(-)).toList
@HelderPereira true,也适用于空列表(所有其他答案都失败):)在任何情况下,我发现Chris Martin的答案最正确(假设空列表是一种特殊情况,应该单独处理)@jarandaf明确地说,空列表是一个特殊的问题,因为一般规则似乎是
final\u size=initial\u size-1
,它提出了一个问题:如何处理空列表。在大多数情况下,返回空列表是可以的(这是您的解决方案所做的),或者可能将返回类型更改为
选项[list[Int]]
和return
None
更有意义,或者如果在这里获取一个空列表是对以前发生的更大问题的诊断,也许我们应该抛出一个
异常
,而不是让它静静地返回一个空列表。但这取决于规范,OP没有指定它。
1
是de错误步骤,所以滑动(2)
就足够了。您的单例列表有问题。您需要在映射之前添加一个
.filter({uu.size>1)
,或者将映射替换为
.collect{case List(x,y)=>x-y}
a.slider(2).映射({uu.reduce({uuuu)).toList
@HelderPereira true,同样适用于空列表(所有其他答案也都失败):)在任何情况下,我发现Chris Martin的答案都是最正确的(假设空列表是一个特殊情况,应该单独处理)。@jarandaf明确地说,空列表是一个特殊情况,由于一般规则似乎是
final\u size=initial\u size-1
,这就提出了如何处理空列表的问题。在大多数情况下,返回空列表是可以的(这是您的解决方案所做的),或者将返回类型更改为
选项[list[Int]]
并返回
None
会更有意义,或者如果在这里获得空列表是对以前发生的更大问题的诊断,也许我们应该抛出一个
异常
,而不是让它静静地返回一个空列表。但是这取决于规格,OP没有指定。你可以使用
收集
而不是
映射
,以避免
列表(12)
上出现异常。哇,你是对的。我希望
List(12)。滑动(2)
返回一个空迭代器。您可以使用
collect
而不是
map
来避免
List(12)
上的异常。哇,您是对的。我希望列表(12)。滑动(2)
返回一个空迭代器。实际上,这个解决方案比压缩的解决方案慢。实际上,这个解决方案比压缩的解决方案慢。