我试图从数组列表中删除一些元素,同时像这样迭代它:
for (String str : myArrayList) {
if (someCondition) {
myArrayList.remove(str);
}
}
当然,当我在迭代myArrayList的同时试图从列表中删除项时,我得到了一个ConcurrentModificationException。有没有简单的办法来解决这个问题?
我试图从数组列表中删除一些元素,同时像这样迭代它:
for (String str : myArrayList) {
if (someCondition) {
myArrayList.remove(str);
}
}
当然,当我在迭代myArrayList的同时试图从列表中删除项时,我得到了一个ConcurrentModificationException。有没有简单的办法来解决这个问题?
当前回答
如果要在遍历过程中修改List,则需要使用迭代器。然后可以使用iterator.remove()在遍历过程中删除元素。
其他回答
一种替代方法是将列表转换为数组,迭代它们,并根据逻辑直接从列表中删除它们。
List<String> myList = new ArrayList<String>(); // You can use either list or set
myList.add("abc");
myList.add("abcd");
myList.add("abcde");
myList.add("abcdef");
myList.add("abcdefg");
Object[] obj = myList.toArray();
for(Object o:obj) {
if(condition)
myList.remove(o.toString());
}
如果要在遍历过程中修改List,则需要使用迭代器。然后可以使用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);
Java 8用户可以这样做:
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
list.removeIf(e -> (someCondition));
它将删除列表中满足someCondition条件的元素
使用迭代器并调用remove():
Iterator<String> iter = myArrayList.iterator();
while (iter.hasNext()) {
String str = iter.next();
if (someCondition)
iter.remove();
}