Scala 使用筛选值筛选条件
我想过滤集合,所以相邻元素之间的距离至少为5 所以Scala 使用筛选值筛选条件,scala,functional-programming,Scala,Functional Programming,我想过滤集合,所以相邻元素之间的距离至少为5 所以List(1,2,3,4,5,6,7,11,20)将变成List(1,6,11,20) 是否可以使用过滤器一次完成?什么是scala方式?尝试使用foldLeft(): 如果不明显: 算法从输出集合中的第一个元素开始(可能需要处理一些边缘情况) 它迭代输入中的所有剩余元素。如果此元素(cur)与input的第一个元素之间的差值大于或等于5,请在input前加上前缀。否则跳过并继续 input是通过预编和检查head来构建的,以获得更好的性能。最后
List(1,2,3,4,5,6,7,11,20)
将变成List(1,6,11,20)
是否可以使用过滤器一次完成?什么是scala方式?尝试使用foldLeft()
:
如果不明显:
输出
集合中的第一个元素开始(可能需要处理一些边缘情况)输入中的所有剩余元素。如果此元素(cur
)与input
的第一个元素之间的差值大于或等于5
,请在input
前加上前缀。否则跳过并继续
input
是通过预编和检查head
来构建的,以获得更好的性能<代码>。最后需要反转基本上,这就是您将如何以命令式方式实现此功能,但语法更加简洁。这一行如何:
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)
标准库
filter
HOF隔离检查元素。为了解决这个问题,通过关闭过滤器功能外的可变状态来进行“非常措施”是不明智的。涉及到fold
的建议,假设它们满足您想要的语义(对我来说,这些语义不是非常清晰)是非常可取的。(如果你说的是“相邻元素之间”而不是“相邻元素之间”,我会说你的要求是非常明确的,建议的答案会起作用。)将问题的措辞从“相邻元素之间”改为“相邻元素之间”
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)