qcha / JBook

Алгоритмы, паттерны, подготовка к собеседованиям, статьи и материалы по Java
731 stars 113 forks source link

Interview: Итератор с предикатом #278

Open aarexer opened 5 days ago

aarexer commented 5 days ago

Оформить в interview/algorithms/easy Условие:

Напишите реализацию итератора, принимающего на вход другой итератор и предикат. Реализованный вами итератор должен отдавать только значения, удовлетворяющие предикату

Решение:

public class PredicateIterator<E> implements Iterator<E> {
    private Iterator<E> it;
    private Predicate<E> predicate;
    private E current;

    public PredicateIterator(Iterator<E> it, Predicate<E> predicate) {
        this.it = it;
        this.predicate = predicate;
        this.current = null;
    }

    @Override
    public boolean hasNext() {
        if (current != null) return true;

        while (it.hasNext()) {
            current = it.next();
            if (predicate.test(current)) return true;
        }

        current = null;
        return false;
    }

    @Override
    public E next() {
        if (current == null && !hasNext()) throw new NoSuchElementException();

        E next = current;
        current = null;
        return next;
    }
}