我试图从数组列表中删除一些元素,同时像这样迭代它:
for (String str : myArrayList) {
if (someCondition) {
myArrayList.remove(str);
}
}
当然,当我在迭代myArrayList的同时试图从列表中删除项时,我得到了一个ConcurrentModificationException。有没有简单的办法来解决这个问题?
我试图从数组列表中删除一些元素,同时像这样迭代它:
for (String str : myArrayList) {
if (someCondition) {
myArrayList.remove(str);
}
}
当然,当我在迭代myArrayList的同时试图从列表中删除项时,我得到了一个ConcurrentModificationException。有没有简单的办法来解决这个问题?
当前回答
可以使用迭代器remove()函数从底层集合对象中删除对象。但在这种情况下,您可以从列表中删除同一对象,而不能删除任何其他对象。
从这里
其他回答
你必须使用迭代器的remove()方法,这意味着没有增强的for循环:
for (final Iterator iterator = myArrayList.iterator(); iterator.hasNext(); ) {
iterator.next();
if (someCondition) {
iterator.remove();
}
}
虽然其他建议的解决方案工作,如果你真的希望解决方案是线程安全的,你应该用CopyOnWriteArrayList替换ArrayList
//List<String> s = new ArrayList<>(); //Will throw exception
List<String> s = new CopyOnWriteArrayList<>();
s.add("B");
Iterator<String> it = s.iterator();
s.add("A");
//Below removes only "B" from List
while (it.hasNext()) {
s.remove(it.next());
}
System.out.println(s);
List myArrayList = Collections.synchronizedList(new ArrayList());
//add your elements
myArrayList.add();
myArrayList.add();
myArrayList.add();
synchronized(myArrayList) {
Iterator i = myArrayList.iterator();
while (i.hasNext()){
Object object = i.next();
}
}
如果要在遍历过程中修改List,则需要使用迭代器。然后可以使用iterator.remove()在遍历过程中删除元素。
作为对其他人答案的替代,我总是这样做:
List<String> toRemove = new ArrayList<String>();
for (String str : myArrayList) {
if (someCondition) {
toRemove.add(str);
}
}
myArrayList.removeAll(toRemove);
这将避免您必须直接处理迭代器,但需要另一个列表。不管出于什么原因,我一直更喜欢这条路线。