我遇到了很多关于 ArrayLists 以及如何操作它们的信息,但似乎没有什么能回答我的问题。
我想检查 arraylist 中的元素是否不存在,如果是,则将其删除,但将另一个 2 添加到列表中。通常很容易,除了我需要将更改添加到另一个数组列表中,该数组列表包含第一个数组列表中的所有元素以及来自其他外部数组列表的元素。
我认为我可以使用临时数组列表来做到这一点,如下所示:
import java.util.ArrayList;
public class main {
public static ArrayList<String> changedArr = new ArrayList(){ {add("M1"); add("alive"); add("M3");} };
public static ArrayList<String> tempArr = new ArrayList();
public static ArrayList<String> totalArr = new ArrayList(){ {add("M1"); add("alive"); add("M3"); add("L4"); add("S5");} };
public static void main(String[] args) {
System.out.println("changedArray = "+changedArr);
System.out.println("tempArray = "+tempArr);
System.out.println("totalArray = "+totalArr);
for(Object a : changedArr){
if(a !="alive") {
tempArr.clear();
changedArr.remove(a);
totalArr.remove(a);
tempArr.add("S6");
tempArr.add("S7");
changedArr.addAll(tempArr);
totalArr.addAll(tempArr);
}
}
System.out.println("\nchangedArray = "+changedArr);
System.out.println("tempArray = "+tempArr);
System.out.println("totalArray = "+totalArr);
}
}
此代码应返回的位置:
changedArray = [M1, alive, M3]
tempArray = []
totalArray = [M1, alive, M3, L4, S5]
changedArray = [alive, S6, S7]
tempArray = [S6, S7]
totalArray = [alive, L4, S5, S6, S7]
相反,它返回:
Exception in thread "main" java.util.ConcurrentModificationException
changedArray = [M1, M2, M3]
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
tempArray = []
at java.util.ArrayList$Itr.next(ArrayList.java:851)
totalArray = [M1, M2, M3, L4, S5]
at main.main(main.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 1
所以我的问题是,我做错了什么导致这些错误?这种方法可行吗?如果不是,我不明白为什么,你能解释一下吗?我怎么能绕过它?
如果您已经做到了这一点,感谢您花时间阅读我的漫谈!:D