在java中迭代

时间:2012-09-05 23:15:25

标签: java iterator

我必须创建一个自定义迭代器,它通过一个数组无休止地迭代。考虑到我之前从未使用过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();
            }
        }
    }
}

3 个答案:

答案 0 :(得分:5)

见下文:

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
  ...

相关的javadoc:
  - 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;
}

答案 1 :(得分: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()的调用从迭代器中提取下一个项目并将其位置增加1。拨打remove()会从列表中删除next()(或previous())返回的最后一项

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

您不能对数组使用迭代器。您需要使用vanilla for-loop或将其转换为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
    }
}

另外,您可以直接使用Numbers班级Iterable

答案 2 :(得分:0)

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

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

Iterator iterator = yourArray.iterator();

第二次迭代,但它有项目:

while(iterator.hasNext()) {
  Object element = iterator.next(); 
}