如何在 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<Something>
。应该是Iterator<Foo>
还是Iterator<Integer>
还是别的什么?
已编辑。这意味着我只需要此类迭代器限制而不是全部。我不知道我说得对不对。
好吧,这个练习只告诉了我上面引用的内容,所以我相信它是 IteratorFoo
实例时会发生什么?什么都没有?
【参考方案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 中创建自定义迭代器?的主要内容,如果未能解决你的问题,请参考以下文章
在 Unity3D 中创建自定义导入器时如何避免项目视图中有两个文件?