1

在这第一次使用我的迭代器时,一切都很顺利;

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());
}

我是否必须重新启动迭代器的索引?

4

5 回答 5

3

是的,换一个新的。迭代器不能被重置或倒带。它朝一个方向迭代,之后应该被丢弃。

于 2013-05-13T13:25:06.940 回答
1

我是否必须重新启动迭代器的索引?

不,它们不能“卷回”。获取一个新的迭代器。

于 2013-05-13T13:24:24.100 回答
1

您的迭代器已经结束,您必须实例化一个新的,以便它指向列表的第一个元素。

于 2013-05-13T13:24:43.290 回答
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

这样,您将无法再次访问迭代器(它本身完成了它的工作并且无法重置),因为它现在超出了范围。

总而言之,这种模式迫使您实例化一个 newIterator以在集合上再次循环,这就是这样做的方法。

于 2013-05-13T13:28:36.513 回答
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");
于 2013-05-13T13:34:01.737 回答