在第一次使用Iterator时,一切顺利;
ListIterator<Client> it = people.listIterator();
while(it.hasNext()){
Client c = (Client)it.next();
System.out.println(c.getValeur());
}
System.out.println("Doing some operations on my values");
但是当我按照我的价值观进行这些操作时
for (Client client : people) {
int i = client.getValeur();
i += 10000;
client.setValeur(i);
}
使用相同的迭代器,我没有工作
while(it.hasNext()){
Client c = (Client) it.next();
System.out.println(c.getValeur());
}
我是否必须重新启动迭代器的索引?
答案 0 :(得分:3)
是的,换一个新的。迭代器无法重置或重绕。它在一个方向上迭代,应该在之后丢弃。
答案 1 :(得分:1)
我是否必须重新启动迭代器的索引?
不,他们不能'伤口'。获取一个新的迭代器。
答案 2 :(得分:1)
你的迭代器已经到了结尾,你必须实例化一个新的迭代器,使它指向列表的第一个元素。
答案 3 :(得分:1)
这就是为什么根本不建议使用while
循环来处理Iterator
。
为什么呢?因为使用while
时范围不是分隔的,并且可能会像您遇到的那样导致一些麻烦。
喜欢使用这种模式:
for(Iterator it = people.listIterator(); it.hasNext();){
Client c = (Client)it.next();
System.out.println(c.getValeur());
}
//can't access it right here (outside the loop) any more
这样,你无法再次访问迭代器(它本身就完成了它的工作并且无法重置),因为它现在超出了范围。
总而言之,此模式会强制您实例化一个新的Iterator
以再次循环遍历该集合,这是可行的方法。
答案 4 :(得分:0)
迭代器是一次性的;一旦它到达迭代结束,它就不会从一开始就重新开始。
相反,仅从问题空间的结构来看,不应该有任何理由不能在同一个迭代器中同时执行所有操作。
int i = 0;
ListIterator<Client> it = people.listIterator();
while(it.hasNext()){
Client c = it.next();
System.out.println(c.getValeur());
i = client.getValeur();
i += 10000;
client.setValeur(i);
}
System.out.println("Doing some operations on my values");