Scala 减去相邻的列表元素
我的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
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]]
和returnNone
更有意义,或者如果在这里获取一个空列表是对以前发生的更大问题的诊断,也许我们应该抛出一个异常
,而不是让它静静地返回一个空列表。但这取决于规范,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)
返回一个空迭代器。实际上,这个解决方案比压缩的解决方案慢。实际上,这个解决方案比压缩的解决方案慢。