在实施Traversable
数据结构时,我可以理解如何使用forEach(f)
实现地图/过滤器甚至折叠:对于数据结构中的每个元素f(element)
将被调用,然后由相应的Traversable
方法解释,并根据它获得的f(element)
调用序列做任何事情。
我不知道如何分别在O(1)或O(k)次中实现isEmpty
或take(3)
。我已经完成了简单的测试,我发现isEmpty实际上只会消耗数据结构的第一个元素(如果有的话,那就是)。
如何在Scala中完成这个魔法?我一直在寻找消息来源,但一切(仍然)对我来说似乎很神奇。 isEmpty
似乎定义如下:
def isEmpty: Boolean = {
var result = true
breakable {
for (x <- this) {
result = false
break
}
}
result
}
由于
答案 0 :(得分:1)
让它变得更简单(功能更少):
def isEmpty: Boolean = {
for (x <- this) {
return false
}
return true
}
如果集合为空,for
循环没有任何结果,所以我们有O(1)。如果集合中有某个元素,则函数在迭代第一个元素时返回false。这也是O(1)。
breakable实现了几乎相同的逻辑。