4

我必须制作一个自定义迭代器,它可以无休止地遍历数组。考虑到我以前从未在 java 中使用过迭代器,我不知道该怎么做。如果有人可以帮助我并向我解释,我将非常感激。

public class Numbers{   
private int[] array;

public Numbers(int[] array){ 
    this.array = array
}
    public static void main(String[] args) {

        Numbers n = new Numbers();
        Iterator num = n.sequence();
        for(int i = 0; i < 10; i++){
            if (num.hasNext()){
                System.out.print(num.next() + " ");
                System.out.println();
            }
        }
    }
}
4

3 回答 3

4

见下文:

public class Numbers implements Iterable<Integer> {
    private int[] array;
    private int i;
    public Numbers(int[] array) { 
        this.array = array;
        i = 0; 
    }

    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            @Override
            public boolean hasNext() { return true; }

            @Override
            public Integer next() {
                int j = i;
                i = (i + 1) % array.length;
                return array[j];
            }

            @Override
            public void remove() {}
        };
    }
}

然后你可以这样做:

Numbers n = new Numbers(new int[]{1,2,3});
for (int i : n)
    System.out.println(i);  // or anything else

这将导致无限循环:

1
2
3
1
2
3
1
2
...

相关的javadocs:
- Iterator
- Iterable


另一种方法是像这样有一个无限的while循环:

int[] array = new int[]{1, 2, 3};
int i = 0;
while (true) {
    System.out.println(array[i]);  // or anything else
    i = (i + 1) % array.length;
}
于 2012-09-05T23:27:05.293 回答
1

这基本上是迭代器的工作方式。此示例使用List,但您可以针对任何实现了 的集合使用迭代器java.lang.Iterable

List<String> someList; // assume this has been instantiated and has values in it

ListIterator<String> it = someList.listIterator();
while (it.hasNext()) {
    String value = it.next();

    // do something with value
}

几乎,你通过告诉集合给你一个对它的迭代器的引用来实例化迭代器。然后你通过调用循环hasNext(),这将使你继续前进,直到你没有更多的元素。调用next()从迭代器中提取下一项并将其位置增加一。调用remove()将从列表中删除由(或.)返回的最后一项next()previous()

当然,请注意,我一直在使用java.util.ListIterator而不是java.util.Iterator因为是针对列表进行优化ListIterator的特殊实现,就像我上面给出的示例一样。Iterator

您不能对数组使用迭代器。您需要使用香草 for 循环或将其转换为List实现Iterable.

要无休止地遍历上面的列表,你的循环看起来像这样:

while(it.hasNext()) {
    String value = it.next();

    // do processing

    if (!it.hasNext()) {
        it = someList.listIterator(); // reset the iterator
    }
}

使用 for 循环无限循环遍历数组:

for (int i = 0; i < myArray.length; i++) {
    myArray[i];
    // do something

    if (i == myArray.length - 1) {
        i = 0; // reset the index
    }
}

或者,您可以让您的NumbersIterable直接实现。

于 2012-09-05T23:26:44.590 回答
0

使用迭代器基本上总是一样的。

首先从您的数组中获取迭代器:

Iterator iterator = yourArray.iterator();

在有项目时进行第二次迭代:

while(iterator.hasNext()) {
  Object element = iterator.next(); 
}
于 2012-09-05T23:24:38.183 回答