从java中最内层的嵌套Iterator中删除元素会导致NoSuchElementException

时间:2016-07-26 00:28:20

标签: java iterator nested nosuchelementexception

我一直在崩溃并在if语句中获取java.util.NoSuchElementException。我的印象是while(Iterator.hasNext())确保Iterator.next()调用不会导致缓冲区溢出。

循环遍历两个嵌套迭代器的正确算法是什么,并在找到匹配项时从其中一个迭代器中删除元素,而不会抛出这样的异常(我认为是由于超越了数组边界)?

在这里输入代码  {

    Iterator<Integer> d = entitiesDeleteQueue.iterator();
    Iterator<Entity> e = entities.iterator();


    while (d.hasNext()) {

        while (e.hasNext()) {

            if (d.next() == e.next().getEntityId())

                e.remove();
        }   
    }
}

2 个答案:

答案 0 :(得分:0)

您需要结合两个hasNext条件以避免迭代器超出:

while (d.hasNext() && e.hasNext()) {
    if (d.next() == e.next.getEntityId())
        e.remove();
}

答案 1 :(得分:0)

问题在于嵌套迭代器与嵌套for循环一样简单。它需要将Iterator.next()分配给对象引用,这样每次需要访问元素时迭代器都不会前进。必须在嵌套的每一层中完成引用,并且必须在外部循环内创建第二个迭代器。然后,您可以通过太多次next()调用来执行操作而不会超出ArrayList。

List<Entity> entities = new ArrayList<Entity>();
List<Entity> entityDeleteQueue = new ArrayList<Entity>(); 

Iterator<Entity> e = entities.iterator();

    while (e.hasNext()) {

        Entity liveEntity = e.next();
        Iterator<Entity> d = entityDeleteQueue.iterator();

        while (d.hasNext()) {

            Entity deadEntity = d.next();

            if( deadEntity.getEntityId() == liveEntity.getEntityId()){

                System.out.println("Dead entity: " + deadEntity.getEntityId());

                System.out.println("Removing entity " + liveEntity.getEntityId());

                e.remove();
            }
        }
    }

    for (Entity survivor: entities){

        System.out.println("Remaining entity: " + survivor.getEntityId());
    }