作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
IObjectTest 是一个接口(interface)单一 boolean 测试(对象 o)方法
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/
我是一名优秀的程序员,十分优秀!