用列表迭代器替换多个for循环

时间:2017-11-27 05:52:51

标签: java for-loop nested-loops listiterator

我想用嵌套的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));
        }
    }

1 个答案:

答案 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}}。