2011-05-01 77 views
2

假设我正在遍历java中的一个集合,在java中多次使用同一集合上的迭代器

Iterator<_someObject_> it = _someObject_.iterator(); 

好吧,首先我想通过集合中的每个对象并对每个访问的对象进行更改。于是我就用:

while(it.hasNext()) { 
     _someObject_ = it.next(); 
     _someObject_.add3();  //made up method 
    } 

现在,我已经做到了这一点,我决定我想通过从开始整组迭代完成一次开展对他们的另一种方法,因为我刚刚做通过我的第一次迭代更改每个元素。

我能再使用

while(it.hasNext()) 

我想也许迭代器有一个指针,所以一旦它达到第一次运行的最后一个元素,如果我再次调用while(it.hasNext()),指针仍然会在该集合的末尾,这意味着我的第二个while循环将会是无意义。

+1

你为什么不写一个简单的测试,你可以感觉到自己是否能正常工作的满意度。 – Buhb 2011-05-01 14:18:40

回答

10

不,你不能这样做。只需要问Iterable对象的另一个迭代器。

+2

当然,如果底层的'Set'实现没有强制执行严格的顺序,那么你不能假定顺序仍然是相同的。所以你会冒一个风险,假设两个'Iterator'的调用会给你相同的内容订单。 ;) – Gressie 2011-05-01 14:17:51

2

迭代器仅限一次性使用。

0

因为我猜你已经发现Iterator没有“重置”方法...所以你只是抓住另一个迭代器。简单。

0

it.hasNext()循环后错误,这正是while循环结束的原因。如果你做了其他while(it.hasNext())之后it.hasNext()仍然是错误的,所以这个循环将立即退出。你需要一个新的循环迭代器。

4

对不起,但Iterator的合同规定您只能经过一次。因为你无法确定下一个Iterator的顺序,甚至不知道这个问题的内容(它可能会改变!),所以你最好在同一个块中做所有的修改或方法调用。

0

确实迭代器只能单独使用,但有一个名为ListIterator的类,允许您通过回顾列表来完成此操作。一个例子是:

ArrayList<String> list = new ArrayList<String>(); 
list.add("hey!"); 
list.add("how"); 
list.add("are"); 
list.add("you?"); 
ListIterator it = list.listIterator(); 
while(it.hasNext()){ 
    System.out.println(it.next() +" ");//you print all the elements 
} 
//Now you go back. You can encapsulate this while sentence into a void reset method. 
while(it.hasPrevious()){ 
    it.previous(); 
} 
//Now you check that you've reached the beginning of the list 
while(it.hasNext()){ 
    System.out.println("back " + it.next() +" ");//you print all the elements 
} 

我认为它可能对你有用,类。

+0

您可以随时创建自己的Iterator并根据需要进行自定义。 – cabreracanal 2011-05-01 15:21:38