如何在 Java 中创建自定义迭代器?

Posted

技术标签:

【中文标题】如何在 Java 中创建自定义迭代器?【英文标题】:How to create a custom Iterator in Java? 【发布时间】:2018-04-14 11:11:32 【问题描述】:

我有这个问题:

给定可迭代的class Foo,它始终只保留一个int 在其构造函数上设置的值,创建一个迭代器,所以它 尊重其所有限制,即:您不能更改 int 初始化后的值。您应该只包括所需的 要抛出的异常。

好的,到目前为止,如果我以正确的方式理解了这个问题,我应该为 Foo 类创建一个迭代器,但是我以前从未这样做过,而且问题本身似乎有点误导.是清单吗?还是不应该?无论如何,尽管如此,我只想知道如何创建它。

所以现在我有了这个:

public class Foo implements Iterable<Foo> 
    @Override
    public Iterator<Foo> iterator()    
        throw new UnsupportedOperationException("Not supported yet."); 
    

但我什至不知道这是否是正确的做法。 如果有人能帮我解决这个问题,我将不胜感激。

提前谢谢你。

【问题讨论】:

'包括所有需要抛出的异常,但只有那些需要的'似乎是矛盾的。寻求澄清。 iterator() 方法的返回类型应该是Iterator&lt;Something&gt;。应该是Iterator&lt;Foo&gt; 还是Iterator&lt;Integer&gt; 还是别的什么? 已编辑。这意味着我只需要此类迭代器限制而不是全部。我不知道我说得对不对。 好吧,这个练习只告诉了我上面引用的内容,所以我相信它是 Iterator ? 那么当我们遍历Foo 实例时会发生什么?什么都没有? 【参考方案1】:

一个最小的例子是返回一个空的迭代器,它的hasNext()总是返回false,而next()将抛出NoSuchElementException

public Iterator<Foo> iterator() 
    return new Iterator<Foo>() 
        public boolean hasNext()  
            return false;
        
        public Foo next() 
            throw new NoSuchElementException();
        
    ;

当然,大多数迭代器都有状态。例如,您可以从 0 迭代到 Foo 实例保存的整数值。

import java.util.Iterator;
import java.util.NoSuchElementException;

public class Foo implements Iterable<Foo> 
    private final int value;

    public Foo(final int value) 
        this.value = value;
    


    @Override
    public Iterator<Foo> iterator() 
        return new Iterator<Foo>() 
            private Foo foo = new Foo(0);

            @Override
            public boolean hasNext() 
                return foo.value < Foo.this.value;
            

            @Override
            public Foo next() 
                if (!hasNext()) throw new NoSuchElementException();

                Foo cur = foo;
                foo = new Foo(cur.value+1);
                return cur;
            
        ;
    

    public static void main(String[] args) 
        Foo foo = new Foo(10);
        for (Foo f: foo) 
            System.out.println(f.value);
        
    

【讨论】:

以上是关于如何在 Java 中创建自定义迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在TensorFlow中创建自定义估算器?

如何在 kafka 中创建自定义序列化程序?

在 Unity3D 中创建自定义导入器时如何避免项目视图中有两个文件?

如何在 TypeScript 中创建自定义类型

如何在 Java 中创建自定义 GUI 组件? (需要开始提示)

如何在 Swift Combine 中创建自定义链?