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

Java-在使用for索引循环迭代列表中的元素时删除该元素

宿嘉庆
2023-03-14

我知道不建议在迭代时从列表中删除元素。
您最好使用iterator.remove()、java流,或者将remove复制到外部列表中。

但这段简单的代码正好起作用:

 static List<Integer> list = new ArrayList<Integer>();
 ...
 private static void removeForI() {
    for (int i = 0; i < 10; i++) {
        if (i == 3) {
            list.remove(i);
            continue;
        }
        System.out.println(i);
    }
 }

使用安全吗?

共有1个答案

关项明
2023-03-14

您需要考虑list.remove(index)是如何工作的。调用remove(idx)时,idx索引处的元素将被删除,所有下一个元素将被左移。假设您有一个包含2,3,3,4,5的列表。现在您要从该列表中删除所有的3。但是如果您使用当前的方法,它将只删除第一个出现的3。因为在移除位置1的第1个3后,内容会被移到左边,就像是2,3,4,5。但是现在您的for循环将把当前索引增加到2,它包含4而不是3。这就是为什么不建议在迭代时移除项,因为项的索引在每次移除后都会更改。

编辑:同样,如果您在循环中断条件中使用常量值,如上面的示例i<10;中,您可能会得到ArrayIndexOutofBounds异常。

 类似资料:
  • 问题内容: 我有一个清单 我想在如下所示的for循环中删除此列表中的元素: 但这是行不通的。我能做什么? 问题答案: 使用循环遍历列表时,不允许从列表中删除元素。 重写代码的最佳方法取决于你要执行的操作。 例如,你的代码等效于: 另外,你可以使用while循环: 我正在尝试删除符合条件的项目。然后我转到下一个项目。 你可以将每个不符合条件的元素复制到第二个列表中: 或者,你可以使用filter或列

  • 问题内容: 有没有我可以用来遍历数组并具有索引和元素的函数,例如Python的枚举? 问题答案: 是。从Swift 3.0开始,如果需要每个元素的索引及其值,则可以使用该方法遍历数组。它返回由索引和数组中每个项目的值组成的对对的序列。例如: 在Swift 3.0之前和Swift 2.0之后,该函数称为: 在Swift 2.0之前,它是全局函数。

  • 问题内容: 当我运行此代码时,我将抛出ConcurrentModificationException。 当我从列表中删除指定的元素时,列表似乎不知道其大小已更改。 我想知道这是否是集合和删除元素的常见问题? 问题答案: 我相信这是Iterator.remove()方法背后的目的,是能够在迭代时从集合中删除一个元素。 例如:

  • 即使使用迭代器,删除列表中的第1和第2个元素也会出现问题。 我已经阅读了以下的线索,但无法解决我的问题(这些是最相关的,但我也检查了其他材料): 尝试从列表中移除元素时的ConcurrentModificationException

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

  • 问题内容: AFAIK有两种方法: 遍历集合的副本 使用实际集合的迭代器 例如, 和 是否有任何理由偏爱一种方法(例如,出于可读性的简单原因而偏爱第一种方法)? 问题答案: 让我举几个例子,并提出一些避免方案。 假设我们有以下藏书 收集并删除 第一种技术是收集所有要删除的对象(例如,使用增强的for循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可