4

私は java.util.LinkedList を繰り返し処理していますが、場合によってはそれに要素を追加します。

LinkedList<Schedule> queue = new LinkedList<Schedule>(schedules);
ListIterator<Schedule> iterator = queue.listIterator();
while (iterator.hasNext()) {
    Schedule schedule = iterator.next();
    if(condition)
        iterator.add(new Schedule());
} 

問題は、たとえば 1 つのアイテムから開始すると、次の iterator.next() 呼び出しの前に新しいアイテムが追加され、反復が終了することです。

反復中にLinkedListの最後にアイテムを追加するにはどうすればよいですか? 問題を正しく解決できないため、別のリストを使用して最初のリストの後にそれを繰り返すように言わないでください。

4

5 に答える 5

1

別のリストを使用できない場合は、イテレータを介して処理した要素の数をカウントし、それをリストの元のサイズと比較することで問題を解決できます。新しい要素はすべてリストの最後になります。元のサイズに達したら、ループを終了できます。

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番目のアプローチを使用することをお勧めします(別のリストに余分な要素を収集し、最後に元の要素に追加します)。

于 2012-04-27T11:19:47.423 に答える
1

イテレータを使用するための厳しい要件がないと仮定すると、それを棚上げして、代わりにインデックスでリストを「反復」できます。

LinkedList<Schedule> list;

for (int i = 0; i < list.size(); i++) {
   final Schedule schedule = list.get(i);
   if(condition)
       list.add(new Schedule());
}
于 2012-04-27T11:44:58.390 に答える
0

反復中にLinkedListの最後にアイテムを追加するにはどうすればよいですか?

public void addWork(Scheduler scheduler)
{
 synchronized(scheduler)
 {
  queue.addLast(scheduler);
 }
}

queue.removeFirst()また、キュー内のアイテムを上から下に処理するために使用できます。

public synchronized Scheduler getWork()
{
  return queue.removeFirst();
}

編集しました。

于 2012-04-27T11:40:25.237 に答える