0

假设我有一个产生项目的循环:

for (int i = 0; true; i++) {
    ComplexObject co = new ComplexObject(i);
    System.out.println(co);
}

标准行为是打印关于对象的描述,但这对于实际应用程序没有多大意义。

我现在希望编写一个自定义迭代器(生成器),通过它我可以获得元素。

所以我需要以next()这样一种方式编写方法,它会ComplexObject在每次next()调用时返回一个,所以它就像循环中的一个步骤。

我该怎么做呢?你会建议我使用什么一般机制?

请记住,我简化了真正的问题以使其易于解释,实际上它当然不像我在这里所说的那么容易,这就是为什么我需要实现我所要求的完全相同的机制。

问候。

附言。(小咆哮)每 24 小时内只允许发布 6 个问题的哔哔声是什么?

4

1 回答 1

0

对于您上面给出的示例,您需要在每次检索元素时保存一些状态,以便知道下一个元素应该具有哪种状态。

这是一个正是这样做的例子。我没有对此进行测试,但它应该清楚地表明我的建议。

public class ComplexObjectIterator implements Iterator<ComplexObject>{
    //track start, so you can tell how many elements were retrieved if you want.
    private final int start;
    private final int end;
    private int position;

    public ComplexObjectIterator(int start, int end){
        if(start>end) throw new Exception("Start must be less "+
            "than or equal to end.");
        this.start = start;
        this.end = end;
        this.position = start;
    }

    public boolean hasNext(){
        return position < end;
    }

    public ComplexObject next(){
        if(position >= end) 
            throw new Exception("No more elements");
        ComplexObject obj = new Complexobject(this.position);
        position+=1;
        return obj;
    }

    public void remove(){
        if(position >= end)
            throw new Exception("No more elements");
        position+=1;
    }
}

如果您真的想要一个无限迭代器,可以轻松更改此代码以提供这种行为。

请注意,迭代器通常用于从底层数据结构返回元素。因为在这里您没有底层结构,所以我会创建一个新接口来调用Generator您的目的,以防止任何人在查看您的代码时感到困惑。

就问题的限制而言,它可能是为了防止恶意用户用过多的问题攻击网站。不是你这样做,只是提供一个可能的解释。

于 2013-08-06T13:42:19.500 回答