如何在 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 中实现过滤迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在基类中实现子类迭代器的统一接口?

向量迭代器不是增量的

如何在类中实现标准迭代器

提高python迭代器的速度

如何在java中实现List集合的遍历

将 SWIG 与 C++ 的 std::map 一起使用时,Java 没有迭代器