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

问题描述 投票:1回答:1

我有这个问题:

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

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

所以我现在这样:

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

但我甚至不知道这是否是正确的方法。如果有人可以帮我解决这个问题,我将非常感激。

先感谢您。

java object iterator iterable
1个回答
2
投票

一个最小的例子是返回一个空的迭代器,其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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.