如何解决以下程序中的ConcurrentModificationException
。
我需要一个列表,其中第一个元素是"Znk"
,然后是列在其后面的排序。
我理解,我得到的是因为我在同一次迭代中添加和删除。但是我如何解决这个问题并获得所需的输出。
public class ListSwapIndex {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> swapIndex = new ArrayList<String>();
ArrayList<String> swapIndextemp = new ArrayList<String>();
swapIndex.add("Ank");
swapIndex.add("Znk");
swapIndex.add("Bnk");
swapIndex.add("Dnk");
swapIndex.add("Enk");
swapIndex.add("Lnk");
for (String string : swapIndex) {
if(string.equals("Znk")){
swapIndextemp.add(string);
swapIndex.remove(string);
}
}
swapIndextemp.addAll(swapIndex);
System.out.println(swapIndextemp);
}
}
答案 0 :(得分:4)
不允许您在迭代时同时修改集合。 Java通过检查正在迭代的集合来保护这一点,并在发现修改时快速失败。
使用ListIterator<T>
而不是使用for
进行迭代 - 每个循环都可以解决问题,因为ArrayList
的列表迭代器允许删除:
for (ListIterator<String> iter=swapIndex.listIterator(); iter.hasNext() ; ) {
String current = iter.next();
if(current.equals("Znk")){
swapIndextemp.add(string);
iter.remove();
}
}
但请注意,此方法不是最理想的,因为从数组列表中删除是O(n)操作,从而导致O(n 2 )整体性能。你最好两次迭代列表 - 一次将所有"Znk"
放在前面,然后再将其余项放在后面。这使您的整体表现为O(n)。