如果您不能使用另一个列表,您可以通过计算您通过迭代器处理的元素数量并将其与列表的原始大小进行比较来解决您的问题:所有新元素都将位于列表的末尾,所以当您达到原始大小时,您可以结束循环。
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 将返回的下一个元素(如果有)之前,并且插入到 next 将返回的下一个元素(如果有)之后。(如果列表不包含任何元素,则新元素将成为列表中的唯一元素。)新元素插入到隐式光标之前:对 next 的后续调用将不受影响,对 previous 的后续调用将返回新元素. (此调用将调用 nextIndex 或 previousIndex 返回的值加一。)
因此,如果列表中有多个元素,它不会将新元素添加到末尾,而是在当前元素和返回的元素之间添加next()
。如果您确实想将新元素放在列表的末尾,请使用queue.add(...)
一般来说,不建议在通过迭代器遍历集合的同时修改集合,所以我建议你使用第二种方法(将额外的元素收集在一个单独的列表中,并在最后将它们添加到原始列表中)