我有一个Scala Iterator
(我可以轻松地使用任何一种数据类型(,它是从Seq
转换而来的。我想把它放在身边,直到我准备好为止,但我也希望能够在O(1(中得到它的大小。我想知道是否有一种内置的设置方法可以让我保持可迭代对象的迭代器大小。
如果您可以支付额外的间接寻址成本,那么最好将其封装在另一个迭代器中。
class SizedIterator[A](underlying: Iterator[A], val initalSize: Int) extends Iterator[A] {
def next = underlying.next
def hasNext = underlying.hasNext
}
然后
new SizedIterator(mySeq.iterator, mySeq.length)
然而,请记住,如果您映射或使用任何新的SizedIterator
,您最终会得到一个普通的Iterator
,并且不再知道initialSize
有多长。
还要记住,您不知道迭代器消耗了多少,所以initialSize
是大小的上限,但当您使用它时,可能就没有了。
或者,您可以
mySeq.iterator.zipWithIndex.map{ case (x,i) => (x, mySeq.length-1) }.take(mySeq.length)
生成一个Iterator
,它是元素和剩余元素数量的对(包括那个元素——这样你永远不会达到零(。
如果你只想要一个已知大小的东西,它会在O(1)
中告诉你,那么Seq
强制转换为Iterable
的.length
方法的解析速度将与该方法为Seq
时的解析速度一样快——这就是重写方法的全部意义——因此(通常(不会每次都使用新的Iterator
。但这需要您保留Iterable
,而不仅仅是Iterator
。