我一直在崩溃并在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();
}
}
}
答案 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());
}