【问题标题】:Removing element from innermost nested Iterator in java causes NoSuchElementException从 Java 中最内层的嵌套迭代器中删除元素会导致 NoSuchElementException
【发布时间】:2016-07-26 00:28:20
【问题描述】:

我在 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();
        }   
    }
}

【问题讨论】:

  • 你应该考虑一下如果entities 有三个元素,而entitiesDeleteQueue 有两个元素会发生什么。您可能想在纸上运行它。
  • d.next() 将在最后一次 e.hasNext() 迭代中溢出。谢谢。
  • 另外,我看到每次调用 next() 时我都在循环内推进最外层的迭代器。我想要的效果是嵌套 for 循环的效果,其中外循环的每次迭代都会将一个外部元素与每个内部元素进行比较。为了实现这一点,我必须调用外部循环的迭代器元素而不推进它,而我在内部循环中。有没有办法做到这一点?

标签: java iterator nested nosuchelementexception


【解决方案1】:

您需要结合您的两个 hasNext 条件以避免任一迭代器溢出:

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

【讨论】:

    【解决方案2】:

    问题在于嵌套迭代器不像嵌套 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());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2014-12-16
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多