Java 删除嵌套循环中的项时的ConcurrentModificationException
这是我的代码,当我删除一个元素时,我获得了一个Java 删除嵌套循环中的项时的ConcurrentModificationException,java,loops,nested,concurrentmodification,Java,Loops,Nested,Concurrentmodification,这是我的代码,当我删除一个元素时,我获得了一个ConcurrentModificationException。我不明白为什么删除itrGrupo2中的元素会影响itrGrupo1 当第二个while完成时,异常发生在:Instancia inst1=(Instancia)itrGrupo1.next() for (int i=0; i<lstPrimeraAgrupacion.size();i++){ List grupo1=new ArrayList(); List grupo
ConcurrentModificationException
。我不明白为什么删除itrGrupo2
中的元素会影响itrGrupo1
当第二个while完成时,异常发生在:Instancia inst1=(Instancia)itrGrupo1.next()
for (int i=0; i<lstPrimeraAgrupacion.size();i++){
List grupo1=new ArrayList();
List grupo2=new ArrayList();
grupo1=(List) lstPrimeraAgrupacion.get(i);
grupo2=(List) lstPrimeraAgrupacion.get(i);
Iterator itrGrupo1 = grupo1.iterator();
while(itrGrupo1.hasNext()) {
List nuevoGrupo=new ArrayList();
Instancia inst1=(Instancia) itrGrupo1.next();
int edad1=Integer.valueOf(inst1.getEdadH());
int carnet1=Integer.valueOf(inst1.getCarnetH());
int antigCli1=Integer.valueOf(inst1.getAntigCli());
Iterator itrGrupo2 = grupo2.iterator();
while(itrGrupo2.hasNext()) {
Instancia inst2=(Instancia) itrGrupo2.next();
int edad2=Integer.valueOf(inst2.getEdadH());
int carnet2=Integer.valueOf(inst2.getCarnetH());
int antigCli2=Integer.valueOf(inst2.getAntigCli());
if(cond){
nuevoGrupo.add(inst2);
itrGrupo2.remove();
}
}
// Put in the final list
if (!nuevoGrupo.isEmpty()){
lstNuevosGrupos.add(nuevoGrupo);
}
}
}
for(int i=0;i问题的存在是由于以下几行:
List grupo1=new ArrayList();
List grupo2=new ArrayList();
grupo1=(List) lstPrimeraAgrupacion.get(i);
grupo2=(List) lstPrimeraAgrupacion.get(i);
这篇文章的前两行创建了两个新的ArrayList
s,但它们后面的行使GRUP1
和GRUP2
指向相同的现有列表。我觉得这是GRUP2
所需要的,因为您正在修改它,而且这段代码的预期效果似乎是修改lstprimeragrupacion
的i
th子列表。(我假设lstprimeragrupacion
是列表
,或实例
对象的子列表。)
代码主体所做的是查看grupo1
中与条件匹配的任何元素,然后将它们从grupo2
中删除。但是,如果这两个变量引用相同的列表
对象,那么修改grupo2
也将更改grupo1
上的迭代器访问的内容,p可能会使它处于中断状态(这就是为什么会出现异常)
现在,有更好的方法来解决迭代列表和删除元素的问题,但是按照您设计代码的方式,影响最小的解决方案是简单地将元素复制到新的列表中,并将其用作旧列表的快照,同时根据需要从actu中删除元素al list。为此,您可以将上述代码更改为以下代码:
List grupo1=new ArrayList();
List grupo2=null;
grupo1.addAll((List) lstPrimeraAgrupacion.get(i)); // Copies the list into our new ArrayList pointed to by grupo1
grupo2=(List) lstPrimeraAgrupacion.get(i); // Makes grupo2 point to the existing List so we can modify it directly.
行grupo1=(List)lstprimeragrupacion.get(i);
和grupo2=(List)lstprimeragrupacion.get(i);
表示您正在获取对同一列表的引用。因此,更改grupo1
的内容也将更改grupo2
的内容,因为它们是对同一对象的引用。感谢Shotgun ninja,我尝试过这样做,但没有解决问题:list lsprimeragrupacion2=new ArrayList();lstprimeragrupacion2=lstprimeragrupacion;我假设lstprimeragrupacion
是一个列表
,或者是列表
的列表
s的实例
对象。如果是这种情况,那么我相信您需要执行grup1.addAll(lstprimeragrupacion.get(I));
而不是grupo1=(List)lstprimeragrupacion.get(i);
,因此您可以将列表的内容复制到新列表中,而不是获取对现有列表的引用。我将重写它作为答案。如果您使用的是Java 1.5或更高版本,则在ArrayList
上使用泛型而不是原始类型。。。