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

3
我有这个问题:
给定可迭代对象class Foo,该对象始终只保留一个int值,该值在其构造函数中设置。创建一个迭代器,以便它遵守所有限制条件,这些限制条件是:初始化后不能更改int值。您应仅包括要抛出的必需异常。
好的,到目前为止,如果我正确理解了问题,我应该为该Foo类创建一个迭代器,但是我以前从未这样做过,似乎问题本身有点误导。它是列表吗?或者不应该是?无论如何,尽管如此,我只想知道如何创建它。
现在我有这个:
public class Foo implements Iterable<Foo> {
    @Override
    public Iterator<Foo> iterator() {   
        throw new UnsupportedOperationException("Not supported yet."); 
    }
}

但是我甚至不确定这是否是正确的做法。 如有人能帮我解决问题,我将不胜感激。

提前致谢。


1
似乎有些矛盾的地方,"Include all of the required exceptions to be thrown but only those that are needed"。请明确一下。 - user207421
iterator()方法的返回类型应该是Iterator<Something>。它应该是Iterator<Foo>还是Iterator<Integer>或其他什么? - clstrfsck
编辑。这意味着我只想要这个类迭代器的必要限制,而不是全部。我不知道我是否表达得正确。 - Miguel Ruivo
没有明确说明...我相信这只是为了教学/训练如何创建一个自定义的迭代器。我认为它应该以某种方式遍历List<Foo>,但这些Foo是自定义的。就练习而言,如果我能理解如何为任何通用类创建适当的迭代器,那就可以了。一个漂亮的例子,展示一些随机类及其自定义迭代器就足够了 :) - Miguel Ruivo
这个词是“自定义”,不是“服装”。我已经在你的帖子中更正了。你需要寻求关于例外情况的澄清。如果我是你,我会这样做。我不理解它。 - user207421
显示剩余4条评论
1个回答

3

一个最简单的例子是返回一个空迭代器,它的hasNext()总是返回falsenext()会抛出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);
        }
    }
}

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