当前位置: 首页 > 知识库问答 >
问题:

迭代列表时,如何从列表中删除项目?[副本]

麻昌翰
2023-03-14

我有以下代码:

while (rrProcesses.size() > 0) {
        for (Process process : rrProcesses) {
            if (process.getBurstTime() <= quantum) {
                System.out.println("@t=" + clock + ", selected for " + process.getBurstTime() + " units");
                clock += process.getBurstTime();
                rrProcesses.remove(process);
            } else {
                System.out.println("@t=" + clock + ", selected for " + quantum + " units");
                clock += quantum;
                process.setBurstTime(process.burstTime - quantum);
            }

            if (processCounter != rrProcesses.size()) {
                System.out.println("@t=" + clock + ", context switch " + contextSwitch + " occurs");
                contextSwitch++;
                clock += latency;
            }
        }
    }

我试图遍历列表中的每个对象,根据条件删除一个项目,并保持循环,直到所有项目都被删除。

当我在intellij中运行这个时,我得到了以下错误:

Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
at com.company.Main.main(Main.java:224)

我搜索了这个问题,找到了这个解决方案。在此处输入链接描述

当我更改代码时,它变成了:

Iterator<Process> iter = rrProcesses.iterator();

    while (iter.hasNext()) {
        for (Process process : rrProcesses) {
            if (process.getBurstTime() <= quantum) {
                System.out.println("@t=" + clock + ", selected for " + process.getBurstTime() + " units");
                clock += process.getBurstTime();
                iter.remove();
            } else {
                System.out.println("@t=" + clock + ", selected for " + quantum + " units");
                clock += quantum;
                process.setBurstTime(process.burstTime - quantum);
            }

            if (processCounter != rrProcesses.size()) {
                System.out.println("@t=" + clock + ", context switch " + contextSwitch + " occurs");
                contextSwitch++;
                clock += latency;
            }
        }
    }

但是,现在我收到以下错误:

Exception in thread "main" java.lang.IllegalStateException
at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:980)
at com.company.Main.main(Main.java:228)

我找到了这个错误的答案,但老实说,它并没有为我澄清任何事情。我如何才能从列表中删除该对象?

共有2个答案

龚奇逸
2023-03-14

替代@shmosel的答案,您还可以使用遍历迭代器的for循环。有了这个,您还可以删除有问题的项目。

基本上,这与您的方法相同(get iter,while iter.hasNext,iter.next),但我更喜欢这种风格,因为它将所有分配的变量保持在循环范围内。

    for (final Iterator<Processes> iter = rrProcesses.iterator(); iter.hasNext();) {
        System.out.println("\t" + iter.next());
    }
马和硕
2023-03-14

您的迭代器循环中仍然有一个for循环。将其替换为:

Process process = iter.next();
 类似资料:
  • 问题内容: Python如何在迭代时从列表中删除项目? 问题答案: 你可以使用列表推导来创建一个仅包含你不想删除的元素的新列表: 或者,通过分配给,你可以将现有列表突变为仅包含所需的项目: 如果还有其他引用somelist需要反映更改,则此方法可能很有用。 除了理解之外,你还可以使用itertools。在Python 2中: 或在Python 3中:

  • 问题内容: 在遍历列表时,我想根据条件删除列表中的项。请参见下面的代码。 这给了我一个例外。 如何才能做到这一点? 问题答案: 您需要使用和调用上,而不是使用循环。

  • 问题内容: 我有创建元素的代码。我需要单击一次删除一个元素。对于每个元素,我都有。我了解我需要一些功能来通过删除项目。如何使用此功能删除ReactJS中的元素?我的代码: 问题答案: 您正在父级组件中管理数据并在子级组件中呈现UI,因此要从子级组件中删除项目,您需要将一个函数与数据一起传递,从子级中调用该函数并在父级组件内部传递列表项的任何唯一标识符使用该唯一标识符删除项目。 步骤1: 将父组件的

  • 我使用firebase数据库和recycler视图。我使用push()向firebase添加了一个项目列表;命令使用push()时,firebase为每个添加的项目创建唯一的id。 现在,我想删除项目点击删除按钮,但当我尝试删除价值();函数到我的数据库参考,它删除所有存储库,而不仅仅是项目。 这就是我现在所拥有的: 从Firebase读取数据的片段 我的onClick按钮 适配器包com。享受应

  • 问题内容: 我需要编写一个简单的函数,该函数将删除包含类对象的所有条目。我编写了函数,但是如果的大小大于1 ,则该函数将不起作用。 编辑#1 错误消息如下: 问题答案: 该代码无法编译。什么啊 无论如何,如果要在迭代时删除元素,则必须使用迭代器的remove方法进行操作: 不过,您的方法可以做到。更直接,更有效。

  • 问题内容: 假设我有一个数字列表: 迭代时,如何从列表中删除元素(例如3)? 我尝试了以下代码,但没有成功: 有任何想法吗? 谢谢,博达·西多(Boda Cydo)。 问题答案: 最好的方法通常是建设性地进行-建立所需项目的新列表,而不要删除不需要的项目。例如: 列表理解建立所需的列表,并分配到“全名单切片” ,确保你 不 只是一个重新绑定的名字,但完全替换 内容 ,所以影响是恒等于你想要的“清除