使用过滤值过滤条件

时间:2013-02-04 21:25:31

标签: scala functional-programming

我想过滤收集,因此相邻元素之间的距离至少为5。

因此List(1, 2, 3, 4, 5, 6, 7, 11, 20)将成为List(1, 6, 11, 20)

是否可以使用过滤器一次性完成?什么是scala-way?

2 个答案:

答案 0 :(得分:7)

这个单行怎么样:

scala> l.foldLeft(Vector(l.head)) { (acc, item) => if (item - acc.last >= 5) acc :+ item else acc }

res7: scala.collection.immutable.Vector[Int] = Vector(1, 6, 11, 20)

答案 1 :(得分:5)

尝试foldLeft()

val input = List(1, 2, 3, 4, 5, 6, 7, 11, 20)

input.tail.foldLeft(List(input.head))((out, cur) => 
  if(cur - out.head >= 5) cur :: out else out
).reverse

如果不明显:

  1. 算法从output集合

  2. 中的第一个元素(可能需要处理一些边缘案例)开始
  3. 它迭代input中的所有剩余元素。如果此元素(cur)与input的第一个元素之间的差异大于或等于5,则前缀为input。否则跳过并继续

  4. input是通过预先添加和检查head来构建的,以获得更好的效果。最后需要.reverse

  5. 这基本上是以命令式方式实现的,但语法更简洁。