🐕

PeekingIterator

2020/12/20に公開

これは何ですか?

イテレータで次の値は欲しいけどイテレータを進めたくないときに使います。
普通は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