在java中多次使用同一个集合上的迭代器

时间:2011-05-01 14:10:15

标签: java

假设我正在迭代java中的一个集合,例如

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

好吧,首先我要浏览集合中的每个对象,并对我访问的每个对象进行更改。所以我用:

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

现在我已经完成了这个,我决定再次从头到尾遍历整个集合以执行另一个方法,因为我刚刚通过第一次迭代对每个元素进行了更改

我可以使用

while(it.hasNext())

再次?

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

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

很抱歉,Iterator的合同规定您只能通过一次。

鉴于你无法确定下一个迭代器的顺序,甚至是那个问题的内容(它可能会改变!),你最好在同一个块中进行所有的修改或方法调用。

答案 2 :(得分:2)

迭代器仅供一次使用。

答案 3 :(得分:0)

正如我猜你发现Iterator没有“重置”方法......所以你只需要抓住另一个迭代器。简单。

答案 4 :(得分:0)

循环后

it.hasNext()为false,这正是while循环结束的原因。如果您之后执行另一个while(it.hasNext()) it.hasNext()仍然是假的,那么此循环将立即退出。你的新循环需要一个新的迭代器。

答案 5 :(得分: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
}

我认为这对你来说很有用。