2016-07-26 11 views
0

if文でjava.util.NoSuchElementExceptionがクラッシュしています。 while(Iterator.hasNext())は、Iterator.next()呼び出しでバッファオーバーランが発生しないことを保証していました。Javaの中で最も内側のネストされたイテレータから要素を削除すると、NoSuchElementExceptionが発生します。

どの2つの入れ子イテレータをループに正しいアルゴリズムであり、そして一致が見つかった場合(私はが配列の境界をオーバーランすることによって引き起こされると思ういる)、このような例外をスローすることなく、イテレータのいずれかから構成要素を削除しますか?

はあなたがいずれかのイテレータのオーバーランを避けるために、あなたの2つのhasNext条件を組み合わせる必要がある {

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'に3つの要素があり、' entitiesDeleteQueue'に2つの要素がある場合、どうなるかを正確に考えてください。あなたは紙の上でそれを走らせたいかもしれません。 –

+0

d.next()は最後のe.hasNext()の繰り返しでオーバーランします。ありがとうございました。 – DayTripperID

+0

また、next()が呼び出されるたびに、ループ内の最も外側のイテレータを進めていることがわかります。私が望む効果は、入れ子のforループの効果です。外側のループの各反復では、外側の要素と内側の要素をそれぞれ比較します。これを実現するには、内側のループにある間に、外側ループの反復子要素を前進させずに呼び出す必要があります。これを達成する方法はありますか? – DayTripperID

答えて

0

ここにコードを入力します。

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

問題は、ネストイテレータはほど簡単ではないということですループのためにネストします。オブジェクト参照にIterator.next()を割り当てる必要があります。つまり、要素にアクセスする必要があるたびにイテレータが進まないようにする必要があります。参照はネストの各レイヤーで行われなければならず、2番目のイテレーターは外側ループ内に作成する必要があります。次に、あまりにも多くの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()); 
    } 
関連する問題