2

假设我有List(1,2,3,4,5),我想得到List(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() 但似乎不能这样做。

4

3 回答 3

12

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

文件:

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

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

于 2013-09-24T19:34:50.963 回答
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)
于 2013-09-24T19:34:04.700 回答
1

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

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

除了可以说比使用 zip 更清晰之外,它更有效的是 zip 创建的中间数据结构(元组列表)不是使用 zipped 创建的。但是,不要将它与无限流一起使用,否则它会吃掉你所有的内存。

于 2013-09-24T23:25:31.987 回答