我想过滤集合,因此相邻元素之间的距离至少为 5。
所以List(1, 2, 3, 4, 5, 6, 7, 11, 20)会变成List(1, 6, 11, 20)。
是否可以使用过滤器一次性实现?什么是scala方式?
我想过滤集合,因此相邻元素之间的距离至少为 5。
所以List(1, 2, 3, 4, 5, 6, 7, 11, 20)会变成List(1, 6, 11, 20)。
是否可以使用过滤器一次性实现?什么是scala方式?
这个单线怎么样:
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)
尝试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
如果不明显:
output算法从集合中的第一个元素开始(可能您需要处理一些边缘情况)
它遍历input. cur如果此元素 ( ) 与 的第一个元素之间的差异input大于或等于5,则添加到input。否则跳过并继续
input是通过前置和检查head来获得更好的性能而构建的。.reverse最后需要
这基本上就是您以命令式的方式实现它的方式,但语法更简洁。