我知道不建议在迭代时从列表中删除元素。
您最好使用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);
}
}
使用安全吗?
您需要考虑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循环),并在完成迭代后删除所有找到的对象。 假设你要执行的操作是“删除”。 如果要“添加”此方法也可