如何对scala中的相邻元素求和
How to sum adjacent elements in scala
我想在 scala 中对相邻元素求和,但不确定如何处理最后一个元素。
所以我有一个列表:
val x = List(1,2,3,4)
我想使用 indices 和 map:
对相邻元素求和
val size = x.indices.size
val y = x.indices.map(i =>
if (i < size - 1)
x(i) + x(i+1))
问题是这种方法在最后创建了一个 AnyVal 元素:
res1: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(3, 5, 7, ())
如果我尝试对集合的元素或其他数值方法求和,它不起作用:
error: could not find implicit value for parameter num: Numeric[AnyVal]
我尝试使用以下方法过滤掉元素:
y diff List(Unit) or y diff List(AnyVal)
但是没用。
scala 中是否有更好的方法来执行这种类型的相邻求和而不使用 foor 循环?
要获得更实用的解决方案,您可以使用 sliding
将元素成对(或任意数量)组合在一起,然后 map
到它们的 sum
。
scala> List(1, 2, 3, 4).sliding(2).map(_.sum).toList
res80: List[Int] = List(3, 5, 7)
sliding(2)
将做的是创建一个列表的中间迭代器,如下所示:
Iterator(
List(1, 2),
List(2, 3),
List(3, 4)
)
所以当我们链接 map(_.sum)
时,我们会将每个内部 List
映射到它自己的总和。 toList
会将 Iterator
转换回 List
。
您也可以尝试模式匹配和尾递归。
import scala.annotation.tailrec
@tailrec
def f(l:List[Int],r :List[Int]=Nil):List[Int] = {
l match {
case x :: xs :: xss =>
f(l.tail, r :+ (x + xs))
case _ => r
}
}
scala> f(List(1,2,3,4))
res4: List[Int] = List(3, 5, 7)
通过压缩两个列表来理解,第二个列表中的第一个项目被删除,
for ( (a,b) <- x zip x.drop(1) ) yield a+b
结果是
List(3, 5, 7)
我想在 scala 中对相邻元素求和,但不确定如何处理最后一个元素。
所以我有一个列表:
val x = List(1,2,3,4)
我想使用 indices 和 map:
对相邻元素求和val size = x.indices.size
val y = x.indices.map(i =>
if (i < size - 1)
x(i) + x(i+1))
问题是这种方法在最后创建了一个 AnyVal 元素:
res1: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(3, 5, 7, ())
如果我尝试对集合的元素或其他数值方法求和,它不起作用:
error: could not find implicit value for parameter num: Numeric[AnyVal]
我尝试使用以下方法过滤掉元素:
y diff List(Unit) or y diff List(AnyVal)
但是没用。
scala 中是否有更好的方法来执行这种类型的相邻求和而不使用 foor 循环?
要获得更实用的解决方案,您可以使用 sliding
将元素成对(或任意数量)组合在一起,然后 map
到它们的 sum
。
scala> List(1, 2, 3, 4).sliding(2).map(_.sum).toList
res80: List[Int] = List(3, 5, 7)
sliding(2)
将做的是创建一个列表的中间迭代器,如下所示:
Iterator(
List(1, 2),
List(2, 3),
List(3, 4)
)
所以当我们链接 map(_.sum)
时,我们会将每个内部 List
映射到它自己的总和。 toList
会将 Iterator
转换回 List
。
您也可以尝试模式匹配和尾递归。
import scala.annotation.tailrec
@tailrec
def f(l:List[Int],r :List[Int]=Nil):List[Int] = {
l match {
case x :: xs :: xss =>
f(l.tail, r :+ (x + xs))
case _ => r
}
}
scala> f(List(1,2,3,4))
res4: List[Int] = List(3, 5, 7)
通过压缩两个列表来理解,第二个列表中的第一个项目被删除,
for ( (a,b) <- x zip x.drop(1) ) yield a+b
结果是
List(3, 5, 7)