簡體   English   中英

從Java中最里面的嵌套Iterator中刪除元素會導致NoSuchElementException

[英]Removing element from innermost nested Iterator in java causes 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();
        }   
    }
}

您需要結合使用兩個hasNext條件,以避免任何一個迭代器的溢出:

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

問題在於嵌套迭代器不像嵌套循環那樣簡單。 它需要將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());
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM