🐕
PeekingIterator
これは何ですか?
イテレータで次の値は欲しいけどイテレータを進めたくないときに使います。
普通はListIteratorでprevious()を使えば間に合います。
ListIteratorよりIteratorの方が効率がよい場合に使います。
ソースコード
import java.util.Iterator;
import java.util.LinkedList;
public class PeekingIterator<E> implements Iterator<E> {
private final Iterator<? extends E> iter;
private final LinkedList<E> peeking = new LinkedList<>();
public PeekingIterator(Iterator<? extends E> iter) {
this.iter = iter;
}
@Override
public boolean hasNext() {
return !peeking.isEmpty() || iter.hasNext();
}
@Override
public E next() {
return peeking.isEmpty() ? iter.next() : peeking.poll();
}
public E peek() {
if (peeking.isEmpty()) {
peeking.add(iter.next());
}
return peeking.peek();
}
@Override
public void remove() {
if (!peeking.isEmpty()) {
throw new IllegalStateException("peek() called before remove()");
}
iter.remove();
}
}
Discussion