java - 如何实现这个FilteringIterator?

标签 java iterator

  1. IObjectTest 是一个接口(interface) 单一 boolean 测试(对象 o)方法

  2. FilteringIterator 是 Iterator 的一个实现,它是 用另一个迭代器初始化 和一个 IObjectTest 实例:new 过滤迭代器(我的迭代器, 我的测试)。您的 FilteringIterator 将 然后允许迭代 'myIterator',但跳过任何 不通过的对象 'myTest' 测试。

由于“hasNext”操作实际上涉及重复移动底层迭代器 直到到达下一个匹配项。问题是它如何将它移回迭代器,因为 hasNext 不应该移动底层迭代器。

最佳答案

如果您想自己做,可以使用类似于我在下面编写的代码。但是,我建议您使用 Guava 的 Iterators.filter(Iterator, Predicate)

public class FilteredIterator<T> implements Iterator<T> {
    private Iterator<? extends T> iterator;
    private Filter<T> filter;
    private T nextElement;
    private boolean hasNext;

    /**
     * Creates a new FilteredIterator using wrapping the iterator and returning only elements matching the filter.
     * 
     * @param iterator
     *            the iterator to wrap
     * @param filter
     *            elements must match this filter to be returned
     */
    public FilteredIterator(Iterator<? extends T> iterator, Filter<T> filter) {
        this.iterator = iterator;
        this.filter = filter;

        nextMatch();
    }

    @Override
    public boolean hasNext() {
        return hasNext;
    }

    @Override
    public T next() {
        if (!hasNext) {
            throw new NoSuchElementException();
        }

        return nextMatch();
    }

    private T nextMatch() {
        T oldMatch = nextElement;

        while (iterator.hasNext()) {
            T o = iterator.next();

            if (filter.matches(o)) {
                hasNext = true;
                nextElement = o;

                return oldMatch;
            }
        }

        hasNext = false;

        return oldMatch;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

public interface Filter<T> {

    /**
     * Determines whether elements should be filtered or not.
     * 
     * @param element the element to be matched against the filter
     * @return {@code true} if the element matches the filter, otherwise {@code false}
     */
    public boolean matches(T element);
}

关于java - 如何实现这个FilteringIterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5474893/

相关文章:

java - 创建一个方法来验证用户 ID

java - Infinispan拦截器配置?

c++ - STL::Map - 遍历列表还是使用查找?

python - 遍历一个文件

C++ - 为 std::array 迭代器的 std::array 创建别名

java - Coldfusion 11 java.nio.file.FileSystemException 错误

java - 如何使用 lambda 表达式在 java 中计算每月排名?

java - 过滤器映射上的 JDK8 lambda NullPointerException

c++ - STL映射,使用类的迭代器和指针

c++ - 如何定义类似于Vector的Vector的Double Brackets/Double Iterator运算符?