![](/img/trans.png)
[英]Why removing element from list using iterator causes ConcurrentModificationException?
[英]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.