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