假设我有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()但似乎无法这样做。
答案 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创建的。但是,不要在无限的流中使用它,否则它将占用你所有的记忆。