Iterator重用问题

时间:2013-05-13 13:23:05

标签: java iterator

在第一次使用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());
}

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

5 个答案:

答案 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");