algorithm - LinearSeqOptimized#查找引用副本

标签 algorithm scala collections

看看Scala 2.10.0LinearSeqOptimized.scala中对LinearSeqOptimized#find的实现,为什么需要调用var这些=这个

为什么不能简单地使用这个

  override /*IterableLike*/
  def find(p: A => Boolean): Option[A] = {
    var these = this
    while (!these.isEmpty) {
      if (p(these.head)) return Some(these.head)
      these = these.tail
    }
    None
  }

最佳答案

因为您必须在循环外具有相同的条件和操作,然后开始使用它们。

将每个人放在同一个篮子中并在循环中完成所有操作要简单得多。示例:

def find(p: A => Boolean): Option[A] = {

  if (!this.isEmpty && p(this.head)) {
    return Some(this.head)
  }

  var these = this.tail

  while (!these.isEmpty) {
    if (p(these.head)) return Some(these.head)
    these = these.tail
  }

  None
}

如您所见,不太聪明。

您还可以轻松地将其实现为 @tailrec 操作:

@tailrec final def find[A](p : A => Boolean) : Option[A] = {    
  if ( this.isEmpty ) {
    None
  } else {
    if ( p(this.head) ) {
      Some(this.head)
    } else {
      this.tail.find(p)
    }
  }
}

在 Scala 中并不是这样完成的,因为 tailrec 调用必须是最终的或私有(private)的。

关于algorithm - LinearSeqOptimized#查找引用副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408487/

相关文章:

scala - 带SBT的条件scalacOptions

scala - 从字符串中获取类

scala - 如何使用spark-submit运行具有多个主要方法的jar?

c# - DataPointCollection 清除性能

javascript - 数组中的递增函数

algorithm - 查找仅包含度数为 2 和 3 的节点的最大子图

java - 根据给定的数字或字符串生成范围内的唯一数字

algorithm - 如何计算两个矩形之间的 "distance"?

java - Java 中的 Groupby 计数

jpa - 如何使用 JPQL 从连接表中删除条目?