java - 遍历列表,同时从列表中删除

标签 java exception iterator

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

LinkedList里面全是我自己的对象,我想循环遍历这个链表,如果满足一个条件就从链表中移除,放回优先级队列中。除了当我的条件是大小时循环时,当我删除时,它会改变大小,因此永远不会检查我的整个列表。

goodJobs 是一个链表。 jobList 是我当前为空的 BinaryHeap。

最初的想法:

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

    }

由于我上面提到的原因,这不起作用,因此,我想到使用哨兵对象来检测列表的末尾,而不是使用列表的大小。使用 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”(通过输入文件指定)> 程序当前时间的对象。

这是整个方法本身:

    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;
}

最佳答案

Iterator.remove() Javadoc 说(部分)

The behavior of an iterator is unspecified if the underlying collection is modified while the iteration is in progress in any way other than by calling this method.

您应该做的是获取Iterator 并进行迭代(在满足您的条件时调用remove())。类似的东西,

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

关于java - 遍历列表,同时从列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37382010/

相关文章:

java - Spring : How to configure tomcat Datasource Programatically in Groovy DAO

android - 完成 Activity 时出现 MediaPlayer 异常

iterator - 如何从 &mut 迭代器中提取值?

java - 如何从 Scala 中的辅助构造函数访问字段?

java - 将 python 与更快的语言混合以在 GAE 中进行优化

Java,读取和写入Autoit脚本的输入和输出流

java - 合并两个列表

c# - 闯入 C# 调试器以除以零

java - java中的迭代器类型(弱一致性)

java - 迭代器不打印明确存在的项目是 LinkedList