【问题标题】:How to implement Filtering Iterator in Java?如何在 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 时,我无法创建这样的对象,因为它是一个接口?

【问题讨论】:

标签: java iterator filtering


【解决方案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 的对象。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2018-04-05
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多