for (String fruit : list)
{
if("banane".equals(fruit))
list.remove(fruit);
System.out.println(fruit);
}
这是一个带删除指令的循环。 在执行时,我在控制台输出下面得到一些ConcurrentModificationException:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Boucle.main(Boucle.java:14)
abricot
banane
问题:如何用循环删除某些元素?
答案 0 :(得分:83)
您需要直接使用迭代器,并通过该迭代器删除该项目。
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
String fruit = iterator.next();
if ("banane".equals(fruit)) {
iterator.remove();
}
System.out.println(fruit);
}
答案 1 :(得分:12)
这看起来有点复杂,为什么不只是做一个正常的循环?我认为它看起来更干净,不会抛出这个错误。如果你删除了某些内容,请记下我。无论如何,至少我的工作。我认为,那些类型的自动循环更适合编码方便,所以如果它们不方便那么就不要使用它们。
for (int i = list.size() - 1; i>=0; i--) {
String fruit = list.get(i);
System.out.println(fruit);
if ("banane".equals(fruit)) {
list.remove(fruit);
}
}
答案 2 :(得分:6)
除了直接使用Iterator
(我建议使用)之外,您还可以将要删除的元素存储在不同的列表中。
List<String> toRemove = new ArrayList<String>();
for (String fruit : list) {
if ("banane".equals(fruit))
toRemove.add(fruit);
System.out.println(fruit);
}
for (String fruit : toRemove) {
list.remove(fruit);
}
请注意,我不推荐这个,它只是另一种选择。 :)
答案 3 :(得分:4)
使用for循环,以相反的顺序循环遍历集合。 (这意味着,从最后一个元素开始,并循环到第一个元素。 通过这样做,您将不会因为从集合中删除元素而导致更改的索引出现问题。
您在发布的示例中得到异常,因为迭代器迭代的列表已更改,这意味着迭代器变为无效。
答案 4 :(得分:4)
for(Iterator<String> iter = list.iterator(); iter.hasNext(); )
{
String fruit = iter.next();
if("banana".equals(fruit))
iter.remove();
System.out.println(fruit);
}
答案 5 :(得分:1)
与Bombe建议的类似,但是通过迭代列表副本,但从较少的代码行中删除,但从原始列表中删除;
List<String> temp = new ArrayList<String>(list);
for (String fruit : temp)
{
if("banane".equals(fruit))
list.remove(fruit);
System.out.println(fruit);
}
我个人认为这看起来比使用迭代器迭代更好。
答案 6 :(得分:1)
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}
是最好的方法..