假设我正在迭代java中的一个集合,例如
Iterator<_someObject_> it = _someObject_.iterator();
好吧,首先我要浏览集合中的每个对象,并对我访问的每个对象进行更改。所以我用:
while(it.hasNext()) {
_someObject_ = it.next();
_someObject_.add3(); //made up method
}
现在我已经完成了这个,我决定再次从头到尾遍历整个集合以执行另一个方法,因为我刚刚通过第一次迭代对每个元素进行了更改
我可以使用
while(it.hasNext())
再次?
我想也许迭代器有一个指针,所以一旦它到达第一次运行的最后一个元素,如果我再次调用while(it.hasNext())
,指针仍然会在集合的末尾,这意味着我的第二个循环没有意义。
答案 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
}
我认为这对你来说很有用。