如何将第n和第(n + 1)个元素折叠到Scala中的新列表中?

时间:2013-09-24 19:30:43

标签: list scala fold

假设我有List(1,2,3,4,5),我想得到 列表(3,5,7,9),即元素和前一个的总和(1 + 2,2 + 3,3 + 4,4 + 5)

我尝试通过制作两个列表来实现这一目标:

val list1 = List(1,2,3,4)
val list2 = (list1.tail ::: List(0))                   // 2,3,4,5,0
for (n0_ <- list1; n1th_ <- list2) yield (n0_ + n1_)

但是它将所有元素彼此组合在一起,就像交叉产品一样,我只想成对地组合元素。我是函数式编程的新手,我以为我会使用map()但似乎无法这样做。

3 个答案:

答案 0 :(得分:12)

List(1, 2, 3, 4, 5).sliding(2).map(_.sum).to[List]完成这项工作。

文档:

def sliding(size: Int): Iterator[Seq[A]] 

通过在它们上面传递“滑动窗口”来对固定大小的块中的元素进行分组(而不是像对分组那样对它们进行分区。)

答案 1 :(得分:2)

您可以将列表与zip合并,然后使用map添加对。

val list1 = List(1,2,3,4,5)
list1.zip(list1.tail).map(x => x._1 + x._2)

res0: List[Int] = List(3, 5, 7, 9)

答案 2 :(得分:1)

我个人认为使用滑动作为Infinity是最清晰的,但如果你想使用基于zip的解决方案,那么你可能想要使用压缩方法:

( list1, list1.tail ).zipped map (_+_)

除了可以说比使用zip更清晰之外,更有效的是,zip创建的中间数据结构(元组列表)不是用zipped创建的。但是,不要在无限的流中使用它,否则它将占用你所有的记忆。