Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用筛选值筛选条件_Scala_Functional Programming - Fatal编程技术网

Scala 使用筛选值筛选条件

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来构建的,以获得更好的性能。最后

我想过滤集合,所以相邻元素之间的距离至少为5

所以
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)