Indeed, calling zipWithIndex
on a collection will traverse it and also create a new collection for the pairs. To avoid this, you can just call zipWithIndex
on the iterator for the collection. This will just return a new iterator that keeps track of the index while iterating, so without creating an extra collection or additional traversing.
This is how scala.collection.Iterator.zipWithIndex
is currently implemented in 2.10.3:
def zipWithIndex: Iterator[(A, Int)] = new AbstractIterator[(A, Int)] {
var idx = 0
def hasNext = self.hasNext
def next = {
val ret = (self.next, idx)
idx += 1
ret
}
}
This should even be a bit more efficient than creating a view on the collection.