2016-07-26 70 views
0

我一直崩潰並在if語句中獲取java.util.NoSuchElementException。我的印象是,雖然(Iterator.hasNext())確保Iterator.next()調用不會導致緩衝區溢出。從java中的最內層嵌套迭代器中移除元素NoSuchElementException

這是通過兩個嵌套的迭代器的正確的算法循環,並且當發現匹配時移除的迭代中的一個元素,而不引發這樣的例外(我認爲通過超速數組邊界引起的)?

進入這裏 {

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


    while (d.hasNext()) { 

     while (e.hasNext()) { 

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

       e.remove(); 
     } 
    } 
} 
+0

如果'entities'有三個元素,'entitiesDeleteQueue'有兩個,你應該考慮到會發生什麼。你可能想在紙上運行它。 –

+0

d.next()將在最後的e.hasNext()迭代中溢出。謝謝。 – DayTripperID

+0

另外,我看到每次調用next()時我都在循環內部推進最外層的迭代器。我想要的效果是嵌套for循環,其中外循環的每次迭代都將一個外部元素與每個內部元素進行比較。爲了實現這一點,我將不得不在不進入它的情況下調用外部循環的迭代器元素,而我在內部循環中。有沒有辦法做到這一點? – DayTripperID

回答

0

你需要你的兩個hasNext條件結合起來,以避免任何迭代器的溢出代碼:

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

的問題是,嵌套迭代器並不像簡單嵌套循環。它需要將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()); 
    }