在java中多次使用同一个集合上的迭代器
假设我在java中迭代一组,例如
Iterator it = _someObject_.iterator();
好吧,首先我要浏览集合中的每个对象,并对我访问的每个对象进行更改。 所以我使用:
while(it.hasNext()) { _someObject_ = it.next(); _someObject_.add3(); //made up method }
既然我已经完成了这个,我决定再次从头到尾遍历整个集合以执行另一个方法,因为我刚刚通过第一次迭代对每个元素进行了更改。
我可以使用吗?
while(it.hasNext())
再次?
我想也许迭代器有一个指针所以一旦它到达第一次运行的最后一个元素,如果我再次调用while(it.hasNext())
,指针仍然会在集合的末尾,这意味着我的第二个循环将是毫无意义的。
不,你不能这样做。 只需向Iterable对象询问另一个迭代器。
对不起,但Iterator
的合同规定你只能通过一次。
鉴于你无法确定下一个Iterator的顺序,甚至是那个问题的内容(它可能会改变!),你最好在同一个块中进行所有的修改或方法调用。
迭代器仅供一次性使用。
正如我猜你发现Iterator没有“重置”方法……所以你只需要抓住另一个Iterator。 简单。
循环后it.hasNext()
为false,这正是while循环结束的原因。 如果你做了另一个while(it.hasNext())
之后it.hasNext()
仍然是假的,所以这个循环将立即退出。 你的新循环需要一个新的迭代器。
确实,迭代器只是单独使用,但有一个名为ListIterator
的类允许您通过回顾列表来完成此操作。 一个例子是:
ArrayList list = new ArrayList (); 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 }
我认为这对你来说很有用。