【问题标题】:What method do I need to use to convert a Producer into a Generator我需要使用什么方法将生产者转换为生成器
【发布时间】:2013-08-07 13:20:18
【问题描述】:

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

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

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

我现在想写一个自定义的迭代器(生成器),通过它我可以获取元素。

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

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

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

问候。

ps。 (小声咆哮)这哔哔声是什么意思?每 24 小时只允许发布 6 个问题?

【问题讨论】:

    标签: java generator producer


    【解决方案1】:

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

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

    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 的新接口,以防止任何人在查看您的代码时感到困惑。

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

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 2014-02-16
      • 2017-11-18
      • 1970-01-01
      • 2016-08-01
      • 2015-07-12
      • 2019-05-18
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多