我想用嵌套的listiterator替换多个嵌套的forloops,但是想知道这是否是调用.next()的问题。因此,如果我说,例如,Iterator attackIter = currentAttackers.iterator();,并为三个列表中的每一个实例化一个迭代器,那么首先运行一个嵌套的forloop用于列表A和B,然后一个用于B和C,将这是第二个循环的问题,因为我已经将.next()一直调用到列表B的末尾?原始循环看起来像这样:
for (int i = 0; i < listA.size(); i++) {
for (int j = 0; j < listB.size(); j++) {
collide(listA.get(i), listB.get(j));
}
}
for (int i = 0; i < listB.size(); i++) {
for (int j = 0; j < listC.size(); j++) {
collide(listB.get(i), listC.get(j));
}
}
答案 0 :(得分:0)
如果您不需要明确使用Iterator
,则使用List
Iterator
的最佳方式是这样的(替换AType
和{{1}使用适当的类型):
BType
这在幕后使用for (AType a : listA) {
for (BType b : listB) {
collide(a, b);
}
}
for (BType b : listB) {
for (CType c : listC) {
collide(b, c);
}
}
并使事情变得简单。请参阅Oracle的文章"The For-Each Loop",了解为什么以这种方式执行此操作而不是明确使用Iterator
是有益的。
如果您需要明确使用Iterator
,可以这样做(基于"The For-Each Loop"中的示例):
Iterator
正如其他人所指出的,每次循环for (Iterator<AType> i = listA.iterator(); i.hasNext(); ) {
AType a = i.next();
for (Iterator<BType> j = listB.iterator(); j.hasNext(); )
collide(a, j.next());
}
}
for (Iterator<BType> i = listB.iterator(); i.hasNext(); ) {
BType b = i.next();
for (Iterator<CType> j = listC.iterator(); j.hasNext(); )
collide(b, j.next());
}
}
时都必须使用新的Iterator
,因为List
无法重置Iterator
以进行另一次迭代{ {1}}。