使用java中的另一个ArrayList更新ArrayList
我遇到了很多关于ArrayList的信息,以及如何操纵它们,但似乎没有什么能回答我的问题 我想检查arraylist中的一个元素是否处于非活动状态,如果是,则将其删除,但将另外2个元素添加到列表中。通常非常简单,只是我需要将更改添加到另一个arraylist,该arraylist包含第一个arraylist中的所有元素以及其他外部arraylist中的元素 我想我可以使用temp arraylist执行此操作,如下所示:使用java中的另一个ArrayList更新ArrayList,java,arraylist,thread-exceptions,Java,Arraylist,Thread Exceptions,我遇到了很多关于ArrayList的信息,以及如何操纵它们,但似乎没有什么能回答我的问题 我想检查arraylist中的一个元素是否处于非活动状态,如果是,则将其删除,但将另外2个元素添加到列表中。通常非常简单,只是我需要将更改添加到另一个arraylist,该arraylist包含第一个arraylist中的所有元素以及其他外部arraylist中的元素 我想我可以使用temp arraylist执行此操作,如下所示: import java.util.ArrayList; public c
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);
}
}
而是返回:
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
for (Object a : changedArr)
在列表上创建隐式迭代器。如果修改列表,则下一次迭代将失败
使用索引尝试正常for循环。这将帮助您解决异常问题您正在修改ArrayList changedArr,同时使用增强的for循环对其进行迭代。这会导致抛出ConcurrentModificationException,因为enhanced for循环为循环生成迭代器,迭代器假设列表在迭代器的生命周期内不会被修改。如果在迭代器对列表进行迭代时修改列表,则会得到ConcurrentModificationException
一个解决方案是有一个原始列表和一个副本,只修改副本。在对列表进行迭代时,绝对不能修改它。如下更改代码:
List<Object> copy = changedArr.stream().collect(Collectors.toList());
for (Object a : copy) {
if (a != "alive") {
tempArr.clear();
changedArr.remove(a);
totalArr.remove(a);
tempArr.add("S6");
tempArr.add("S7");
changedArr.addAll(tempArr);
totalArr.addAll(tempArr);
}
}
List copy=changedar.stream().collect(Collectors.toList());
用于(对象a:副本){
如果(a!=“活着”){
tempArr.clear();
更改。删除(a);
总arr.移除(a);
临时议程增补(“S6”);
临时添加(“S7”);
更改日期添加所有(临时);
总加总(临时);
}
}
引发ConcurrentModificationException
,因为您在迭代过程中正在修改changedar
。迭代器注意到这些更改并引发异常。解决这个问题的一个非常简单明了的方法是使用:
非常感谢您的建议@Max Weinzierl,工作出色!我添加了一个“加法器”数组用作中间人 对于任何可能有类似问题的人,以下是重新编译的代码:
import java.util.ArrayList;
public class main {
public static ArrayList<String> changedArr = new ArrayList(){ {add("M1"); add("alive"); add("M3");} };
public static ArrayList<String> addedArr = new ArrayList();//----- New ArrayList 'addedArr' used for adding the new elements
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) {
tempArr.addAll(changedArr);//--------------------------------- Duplicated changedArr
System.out.println("addedArray = "+addedArr);
System.out.println("tempArray = "+tempArr);
System.out.println("changedArray = "+changedArr);
System.out.println("totalArray = "+totalArr+"\n");
int counter = 0;//-------------------------------------------- Counter to increment the added elements
for(Object a : changedArr){
addedArr.clear();//--------------------------------------- Make sure 'addedArr' is cleared at start of each loop
if(a !="alive") {
tempArr.remove(a);
totalArr.remove(a);
addedArr.add("S"+(6+counter));
counter++;
addedArr.add("S"+(6+counter));
counter++;
tempArr.addAll(addedArr);//--------------------------- Adds new elements to tempArr to be added to changedArr
totalArr.addAll(addedArr);//-------------------------- Adds new elements to totalArr
}
System.out.println("addedArray = "+addedArr);
}
changedArr.clear();//----------------------------------------- Clear changedArr to make sure that anything removed in the loop is removed
changedArr.addAll(tempArr);//--------------------------------- Add all changes from tempArr to changedArr
System.out.println("\ntempArray = "+tempArr);
System.out.println("changedArray = "+changedArr);
System.out.println("totalArray = "+totalArr);
}
}
import java.util.ArrayList;
公共班机{
publicstaticarraylistchangedar=newarraylist(){{add(“M1”);add(“alive”);add(“M3”);};
public static ArrayList adddarr=new ArrayList();/----用于添加新元素的new ArrayList'adddar'
public static ArrayList tempArr=new ArrayList();
publicstaticarraylisttotalarr=newarraylist(){{add(“M1”);add(“alive”);add(“M3”);add(“L4”);add(“S5”);};
公共静态void main(字符串[]args){
tempArr.addAll(changedar);//--------------------------------------重复的changedar
System.out.println(“adddarray=“+adddarr”);
System.out.println(“tempArray=“+tempArr”);
System.out.println(“changedArray=“+changedArr”);
System.out.println(“totalArray=“+totalArr+”\n”);
int counter=0;//-----------------------------------计数器以递增添加的元素
用于(对象a:changedArr){
adddarr.clear();/---------------------------------------确保在每个循环开始时清除“adddarr”
如果(a!=“活着”){
临时移除(a);
总arr.移除(a);
加法器。加法(“S”+(6+计数器));
计数器++;
加法器。加法(“S”+(6+计数器));
计数器++;
tempArr.addAll(adddarr);//-------------------------------向tempArr添加新元素以添加到changedar
addAll(adddarr);//------------------------------向totalArr添加新元素
}
System.out.println(“adddarray=“+adddarr”);
}
changedArr.clear();/---------------------------------------清除changedArr以确保删除循环中删除的任何内容
changedar.addAll(tempArr);//-------------------------------------将tempArr中的所有更改添加到changedar
System.out.println(“\ntempArray=“+tempArr”);
System.out.println(“changedArray=“+changedArr”);
System.out.println(“totalArray=“+totalArr”);
}
}
ListIterator iterator = changedArr.listIterator();
while (iterator.hasNext()) {
Object a = iterator.next();
if (a != "alive") {
iterator.remove(); // removes 'a' from changedArr
iterator.add("S6"); // adds "S6" to changedArr
iterator.add("S7");
// etc.
}
}
import java.util.ArrayList;
public class main {
public static ArrayList<String> changedArr = new ArrayList(){ {add("M1"); add("alive"); add("M3");} };
public static ArrayList<String> addedArr = new ArrayList();//----- New ArrayList 'addedArr' used for adding the new elements
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) {
tempArr.addAll(changedArr);//--------------------------------- Duplicated changedArr
System.out.println("addedArray = "+addedArr);
System.out.println("tempArray = "+tempArr);
System.out.println("changedArray = "+changedArr);
System.out.println("totalArray = "+totalArr+"\n");
int counter = 0;//-------------------------------------------- Counter to increment the added elements
for(Object a : changedArr){
addedArr.clear();//--------------------------------------- Make sure 'addedArr' is cleared at start of each loop
if(a !="alive") {
tempArr.remove(a);
totalArr.remove(a);
addedArr.add("S"+(6+counter));
counter++;
addedArr.add("S"+(6+counter));
counter++;
tempArr.addAll(addedArr);//--------------------------- Adds new elements to tempArr to be added to changedArr
totalArr.addAll(addedArr);//-------------------------- Adds new elements to totalArr
}
System.out.println("addedArray = "+addedArr);
}
changedArr.clear();//----------------------------------------- Clear changedArr to make sure that anything removed in the loop is removed
changedArr.addAll(tempArr);//--------------------------------- Add all changes from tempArr to changedArr
System.out.println("\ntempArray = "+tempArr);
System.out.println("changedArray = "+changedArr);
System.out.println("totalArray = "+totalArr);
}
}