我想过滤集合,因此相邻元素之间的距离至少为 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
最后需要
这基本上就是您以命令式的方式实现它的方式,但语法更简洁。