Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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时,ConcurrentModificationException_Java_Android_Arrays - Fatal编程技术网

Java 当我试图用迭代器编辑ArrayList时,ConcurrentModificationException

Java 当我试图用迭代器编辑ArrayList时,ConcurrentModificationException,java,android,arrays,Java,Android,Arrays,我有一个对象的ArrayList,我试图编辑其中一个对象的字段,但当我这样做时,我收到ConcurrentModificationException。我已经读到我需要使用迭代器,但即使这样,我仍然收到错误消息 我的代码: if(summedEmotionValuesArrayList.size() == 0){ summedEmotionValuesArrayList.add(newEmotionValuesDataset); }else { for (Iterator<E

我有一个对象的ArrayList,我试图编辑其中一个对象的字段,但当我这样做时,我收到ConcurrentModificationException。我已经读到我需要使用迭代器,但即使这样,我仍然收到错误消息

我的代码:

if(summedEmotionValuesArrayList.size() == 0){
    summedEmotionValuesArrayList.add(newEmotionValuesDataset);
}else {
    for (Iterator<EmotionValuesDataset> currentEmotionValuesDataset = summedEmotionValuesArrayList.iterator(); currentEmotionValuesDataset.hasNext(); ) {
        EmotionValuesDataset emotionValuesDataset = currentEmotionValuesDataset.next();
        if (emotionValuesDataset.getEmotionName().equals(newEmotionValuesDataset.getEmotionName())) {
            double newValue = emotionValuesDataset.getEmotionValue() + newEmotionValuesDataset.getEmotionValue();
            emotionValuesDataset.setEmotion_value(newValue);
        } else {
            summedEmotionValuesArrayList.add(newEmotionValuesDataset);
        }
    }
}
if(summedMotionValuesArrayList.size()==0){
SummedMotionValuesArrayList.add(新情感值数据集);
}否则{
对于(迭代器currentEmotionValuesDataset=SummedMotionValuesArrayList.Iterator();currentEmotionValuesDataset.hasNext();){
EmotionValuesDataset EmotionValuesDataset=currentEmotionValuesDataset.next();
if(emotionValuesDataset.getEmotionName().equals(newEmotionValuesDataset.getEmotionName())){
double newValue=emotionValuesDataset.getEmotionValue()+newEmotionValuesDataset.getEmotionValue();
情绪值数据集。设置情绪值(新值);
}否则{
SummedMotionValuesArrayList.add(新情感值数据集);
}
}
}
此代码在for循环中执行多次。此行上出现错误消息

EmotionValuesDataset EmotionValuesDataset=currentEmotionValuesDataset.next()

非常感谢您的帮助

summedEmotionValuesArrayList.add(newEmotionValuesDataset);
如果这行代码有问题,您应该创建一些其他列表(将其命名为yourTempList)并在退出后添加元素,以便循环使用

summedEmotionValuesArrayList.addAll(yourTempList)

迭代ArrayList时,迭代器总是将modCount检查为迭代开始时保存的值。此值随每次添加、删除、设置等而更改。。。如果它在迭代过程中发生更改,则会抛出一个
ConcurrentModificationException

如果要删除当前所在的项,可以使用迭代器#remove方法,该方法可以更新expectedModCount。在向ArrayList添加值时,可以将它们保存在临时列表中,然后在迭代结束时,将所有这些元素添加到原始列表中

for(...) {
    ...
    temp.add(newValue);
    ...
}
summedEmotionValuesArrayList.addAll(temp);

您正在尝试基本上将值添加到arraylist
SummedMotionValuesArrayList
。如果您研究
add
的实现方式

    public void add(E e) {
        checkForComodification();

        try {
            int i = cursor;
            ArrayList.this.add(i, e);
            cursor = i + 1;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }
而且,如果您查看
checkForComodification()
的实现,您可以看到它检查
modCount

因此,基于此,以及的文档,您可以看到以下内容

如果此字段的值意外更改,则迭代器(或列表 迭代器)将抛出ConcurrentModificationException以响应 下一步、删除、上一步、设置或添加操作。这就提供了 快速失效行为,而不是表面上的非确定性行为 迭代过程中并发修改的过程

因此,解决这个问题的方法是创建一个新的临时列表。这一点已经得到了回答。反正

    ArrayList<EmotionValuesDataset> tempList = new ArrayList();

    for(...){
        //use your logic, but instead of  summedEmotionValuesArrayList.add(newEmotionValuesDataset);
        tempList.add(newEmotionValuesDataset);

    }

    //outside of forloop
    summedEmotionValuesArrayList.addAll(tempList)
ArrayList tempList=new ArrayList();
对于(…){
//使用您的逻辑,但不要使用SummedMotionValuesArrayList.add(newEmotionValuesDataset);
添加(newEmotionValuesDataset);
}
//forloop外
SummedMotionValuesArrayList.addAll(模板列表)
我希望有帮助