Traversable.isEmpty如何在O(1)中计算Traversable是否为空或仅基于Scala中的forEach()?

时间:2015-09-29 05:06:58

标签: scala traversal scala-collections

在实施Traversable数据结构时,我可以理解如何使用forEach(f)实现地图/过滤器甚至折叠:对于数据结构中的每个元素f(element)将被调用,然后由相应的Traversable方法解释,并根据它获得的f(element)调用序列做任何事情。

我不知道如何分别在O(1)或O(k)次中实现isEmptytake(3)。我已经完成了简单的测试,我发现isEmpty实际上只会消耗数据结构的第一个元素(如果有的话,那就是)。

如何在Scala中完成这个魔法?我一直在寻找消息来源,但一切(仍然)对我来说似乎很神奇。 isEmpty似乎定义如下:

  def isEmpty: Boolean = {
    var result = true
    breakable {
      for (x <- this) {
        result = false
        break
      }
    }
    result
  }

由于

1 个答案:

答案 0 :(得分:1)

让它变得更简单(功能更少):

def isEmpty: Boolean = {
    for (x <- this) {
        return false
    }
    return true
}

如果集合为空,for循环没有任何结果,所以我们有O(1)。如果集合中有某个元素,则函数在迭代第一个元素时返回false。这也是O(1)。

breakable实现了几乎相同的逻辑。