如何对scala中的相邻元素求和

use*_*028 5 collections scala

我想在scala中对相邻元素求和,我不知道如何处理最后一个元素.

所以我有一个清单:

val x = List(1,2,3,4)
Run Code Online (Sandbox Code Playgroud)

我想使用索引映射来对相邻元素求和:

val size = x.indices.size
val y = x.indices.map(i => 
    if (i < size - 1)
       x(i) + x(i+1))
Run Code Online (Sandbox Code Playgroud)

问题是这种方法在最后创建了一个AnyVal元素:

res1: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(3, 5, 7, ())
Run Code Online (Sandbox Code Playgroud)

如果我尝试对集合中的元素或其他数字方法求和,则它不起作用:

error: could not find implicit value for parameter num: Numeric[AnyVal]
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下方法过滤掉元素:

y diff List(Unit) or y diff List(AnyVal)
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

在scala中有没有更好的方法来做这种类型的相邻和而不使用foor循环?

Mic*_*jac 14

对于更实用的解决方案,您可以使用sliding两个元素(或任意数量的元素)将元素分组,然后map分配给它们sum.

scala> List(1, 2, 3, 4).sliding(2).map(_.sum).toList
res80: List[Int] = List(3, 5, 7)
Run Code Online (Sandbox Code Playgroud)

我们sliding(2)要做的是创建一个像这样的列表的中间迭代器:

Iterator(
    List(1, 2),
    List(2, 3),
    List(3, 4)
)
Run Code Online (Sandbox Code Playgroud)

因此,当我们链接时map(_.sum),我们将每个内部映射List到它自己的总和.toList将后者转换IteratorList.