Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java中的另一个ArrayList更新ArrayList_Java_Arraylist_Thread Exceptions - Fatal编程技术网

使用java中的另一个ArrayList更新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

我遇到了很多关于ArrayList的信息,以及如何操纵它们,但似乎没有什么能回答我的问题

我想检查arraylist中的一个元素是否处于非活动状态,如果是,则将其删除,但将另外2个元素添加到列表中。通常非常简单,只是我需要将更改添加到另一个arraylist,该arraylist包含第一个arraylist中的所有元素以及其他外部arraylist中的元素

我想我可以使用temp arraylist执行此操作,如下所示:

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);
    }
}