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