我有一个列表,我需要迭代并删除某些项目。我不能使用迭代器,因为我需要调用每个项目的方法(例如ls.getStatus()
),这些方法不适用于迭代器。如果ls.getStatus() == 0
我需要删除该项目。如何避免ConcurrentModificationException
?
for (MyList ls : list) {
if (ls.getStatus() == 0) {
ls.run();
list.remove();
} else {
ls.create();
}
}
由于
答案 0 :(得分:5)
为什么你认为你不能使用迭代器?
Iterator<MyList> i = list.iterator();
while (i.hasNext()) {
MyList ls = i.next();
//... all your other code which uses ls...
i.remove();
}
此方法也可能更快,因为使用iterator.remove()
可以避免必须在列表中搜索list.remove(item)
所需的项目。
答案 1 :(得分:1)
您可以使用迭代器,但只能放弃增强的for循环:
for (Iterator<MyList> iterator = list.iterator(); iterator.hasNext(); ) {
MyList ls = iterator.next();
if (ls.getStatus() == 0) {
lo.run(zo);
iterator.remove();
} else {
ls.create();
}
}
当然,假设list
指的是支持删除操作的类型。
答案 2 :(得分:-1)
如果您的迭代器不支持删除操作,您可以使用以下算法:
在第一步中,您可以迭代列表创建要删除的元素索引列表。下一步是向后迭代索引列表并按索引删除元素。