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();
}
}
}
'entities'に3つの要素があり、' entitiesDeleteQueue'に2つの要素がある場合、どうなるかを正確に考えてください。あなたは紙の上でそれを走らせたいかもしれません。 –
d.next()は最後のe.hasNext()の繰り返しでオーバーランします。ありがとうございました。 – DayTripperID
また、next()が呼び出されるたびに、ループ内の最も外側のイテレータを進めていることがわかります。私が望む効果は、入れ子のforループの効果です。外側のループの各反復では、外側の要素と内側の要素をそれぞれ比較します。これを実現するには、内側のループにある間に、外側ループの反復子要素を前進させずに呼び出す必要があります。これを達成する方法はありますか? – DayTripperID