迭代列表,同时从列表中删除

时间:2016-05-23 02:58:49

标签: java exception iterator

所以基本上这里是我的问题......我有2个结构,一个LinkedList和一个优先级Que(BinaryHeap)。

LinkedList充满了我自己的对象,我想循环遍历列表,如果满足条件,则从列表中删除并将其放回优先级que。除非当我的条件是大小时我循环,当我删除时,它会改变大小,因此从不检查我的整个列表。

goodJobs是一个LinkedList。 jobList是我目前空的BinaryHeap。

最初的想法:

    for (int i = 0; i < goodJobs.size(); i++) {
        if (((Job) goodJobs.get(i)).getArrivalTime() > time) {
            jobList.insert((Comparable) goodJobs.remove(i));
        }

    }

由于我上面提到的原因,这不起作用,所以相反,我想使用一个sentinel对象来检测列表的结尾,而不是使用列表的大小。使用Java的迭代器......

ListIterator i;

int k = 0;
for (i = goodJobs.listIterator(); i.hasNext(); i.next() ) {

    if (((Job) goodJobs.get(k)).getArrivalTime() > time) {
        jobList.insert((Comparable) goodJobs.remove(k));
    }

    k++;
}

我很快就了解到,在修改它(从中移除)时,无法通过ConcurrentModificationException从列表中删除。

我不确定如何绕过这里的十字路口。该方法的想法是,在BinaryHeap中我有一堆对象,我想删除那些具有“ArrivalTime”(通过输入文件指定)的对象,&gt;该计划的当前时间。

以下是整个方法本身:

    private LinkedList findCandidates() {

    LinkedList goodJobs = new LinkedList();

    while (!jobList.isEmpty()) {
        goodJobs.add(jobList.deleteMinimum());
    }


    for (int i = 0; i < goodJobs.size(); i++) {
        if (((Job) goodJobs.get(i)).getArrivalTime() > time) {
            jobList.insert((Comparable) goodJobs.remove(i));
        }

    }


    return goodJobs;
}

2 个答案:

答案 0 :(得分:4)

Iterator.remove() Javadoc说(部分)

  

如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。

您应该做的是获取Iterator并迭代(在满足条件时调用remove())。像,

Iterator<Job> iter = goodJobs.iterator();
while (iter.hasNext()) {
    Job j = iter.next();
    if (j.getArrivalTime() > time) {
        jobList.insert(j);
        iter.remove();
    }
}

答案 1 :(得分:0)

建议尝试使用CopyOnWriteArrayList而不是LinkedList。