gpt4 book ai didi

java - 如何实现这个FilteringIterator?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:09:04 25 4
gpt4 key购买 nike

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com