1

我有一个IteratorSeq. 我想保留它直到我准备好它,但我也希望能够在 O(1) 中获得它的大小。我想知道是否有一种内置的设置方法可以让我保持可迭代对象上的迭代器大小。

4

1 回答 1

2

如果您可以支付额外间接的成本,最好的选择是将其包装在另一个迭代器中。

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元素对和剩下的元素数量(包括那个——这样你永远不会达到零)。

如果你只想要一个已知大小的东西,它会告诉你 in O(1),那么转换为的.length方法将与该方法在它是时一样快地解析——这是覆盖方法的重点——因此不会t(通常)每次消费一个新的。但这需要你保持周围,而不仅仅是一个.SeqIterableSeqIteratorIterableIterator

于 2013-05-05T22:16:28.610 回答