如何在Java中实现过滤迭代器?

3

我创建了一个对象数组(tab []),现在需要通过其中一个字段进行过滤和打印(例如,如果ob.a> 1,则打印)。我创建了一个Iterator接口,ArrayIterator,它遍历列表中的所有条目和Predicate接口。这是我的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接口的类,并创建该类的一个实例。 - Louis Wasserman
你是在询问如何在Java中实现接口吗?参考链接 - shmosel
2
可能是如何实现这个FilteringIterator?的重复问题。 - Andreas
如果您展示了遍历自定义列表的客户端代码,那将会很有帮助,因为我不明白过滤迭代器是如何通过构造函数传递的;通常我们使用 myList.iterator() 来获取迭代器的实现以遍历元素。 - Rockoder
这个回答解决了你的问题吗?如何实现这个 FilteringIterator? - MJar
1个回答

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;
    }

}

3
hasNext()是什么意思? - dnault
1
@dnault,实现这个功能会很不错 - 但它并不是问题的一部分... 其次,在看到next如何实现后 - 对于hasNext做类似的事情应该不太困难。 - Nir Alfasi
1
这个答案很有帮助,我没有创建实现 Predicate 的对象。 - filiard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接