Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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 删除嵌套循环中的项时的ConcurrentModificationException_Java_Loops_Nested_Concurrentmodification - Fatal编程技术网

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
上使用泛型而不是原始类型。。。