如何在 Java 中实现过滤迭代器?
Posted
技术标签:
【中文标题】如何在 Java 中实现过滤迭代器?【英文标题】:How to implement Filtering Iterator in Java? 【发布时间】:2017-08-05 11:24:45 【问题描述】:我创建了一个对象数组 (tab[]),现在我需要通过其中一个字段过滤和打印(例如 print if ob.a>1 )。我创建了一个迭代器接口 ArrayIterator,它遍历列表和谓词接口上的所有条目。这是我的 FilteringIterator 的构造函数:
private final Iterator iterf;
private final Predicate pred;
public FilteringIterator(ArrayIterator i, Predicate predykat)
iterf=i;
pred=predykat;
iterf.first();
使用我的“基本”迭代器打印每个条目的方法如下所示:
public void printlist()
ArrayIterator itab =new ArrayIterator(lista);
for(itab.first();!itab.isDone(); itab.next())
Student stud=(Student)itab.current();
stud.show();
我还有一个实现 Predicate 接口的类:
public interface Predicate
public boolean accept(Object ob);
如何使用我的 FilteringIterator,当它需要 Predicate 时,我无法创建这样的对象,因为它是一个接口?
【问题讨论】:
创建一个实现Predicate
的类,并创建该类的实例。
你在问how to implement an interface in Java吗?
How to implement this FilteringIterator?的可能重复
如果我不明白过滤的迭代器是如何通过构造函数传递的,那么查看迭代自定义列表的客户端代码会很有帮助;通常我们做 myList.iterator() 来实现迭代器来遍历元素
这能回答你的问题吗? How to implement this FilteringIterator?
【参考方案1】:
听起来你想在FilteringIterator
类中实现next()
。
它应该是这样的:
public T next()
T next = iterf.next();
while (!pred.accept(next))
next = iterf.next();
return next;
既然您看到了next()
,那么实现hasNext()
也应该是一个简单的练习!
为了创建谓词,您应该实现 Predicate 接口,例如:
class MyPredicate implements Predicate
@Override
public boolean accept(Object ob)
if (!ob instanceof Student)
return false;
Student student = (Student) ob;
return student.a > 1;
【讨论】:
hasNext()
呢?
@dnault 实现起来会很好——但这不是问题的一部分......其次,在看到next
是如何实现的之后——做类似的事情应该不会太难hasNext
的东西。
这个答案有帮助,我没有创建一个实现 Predicate 的对象。以上是关于如何在 Java 中实现过滤迭代器?的主要内容,如果未能解决你的问题,请参考以下文章