別のリストを使用できない場合は、イテレータを介して処理した要素の数をカウントし、それをリストの元のサイズと比較することで問題を解決できます。新しい要素はすべてリストの最後になります。元のサイズに達したら、ループを終了できます。
LinkedList<Schedule> queue = new LinkedList<Schedule>(schedules);
int origSize = queue.size();
int currCount = 0;
ListIterator<Schedule> iterator = queue.listIterator();
while (iterator.hasNext()) {
++currCount;
if (currCount >= origSize) {
break; // reached the end of the original collection
}
Schedule schedule = iterator.next();
if(condition)
iterator.add(new Schedule());
}
追加のリストを使用して新しい要素を追跡し、処理が終了した後にそれを元のリストに追加することもできます。
LinkedList<Schedule> queue = new LinkedList<Schedule>(schedules);
LinkedList<Schedule> addQueue = new LinkedList<Schedule>();
ListIterator<Schedule> iterator = queue.listIterator();
while (iterator.hasNext()) {
Schedule schedule = iterator.next();
if(condition)
addQueue.add(new Schedule());
}
queue.addAll(addQueue);
また、注意してくださいiterator.add()
指定した要素をリストに挿入します(オプションの操作)。要素は、nextによって返される次の要素の直前、およびpreviousによって返される次の要素の後に挿入されます(存在する場合)。(リストに要素が含まれていない場合、新しい要素がリストの唯一の要素になります。)新しい要素は暗黙カーソルの前に挿入されます。nextへの後続の呼び出しは影響を受けず、previousへの後続の呼び出しは新しい要素を返します。 。(この呼び出しは、nextIndexまたはpreviousIndexの呼び出しによって返される値を1つ増やします。)
したがって、リストに複数の要素がある場合、新しい要素は最後に追加されませんが、現在の要素と。によって返される要素の間に追加されnext()
ます。本当に新しい要素をリストの最後に配置したい場合は、queue.add(...)
一般に、イテレータを介してコレクションをトラバースしているときにコレクションを変更することはお勧めできません。そのため、2番目のアプローチを使用することをお勧めします(別のリストに余分な要素を収集し、最後に元の要素に追加します)。