Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 嵌套遍历列表,然后进行最终删除_Java_Oop_Loops_Iterator - Fatal编程技术网

Java 嵌套遍历列表,然后进行最终删除

Java 嵌套遍历列表,然后进行最终删除,java,oop,loops,iterator,Java,Oop,Loops,Iterator,我正在尝试遍历一个列表,同时已经在其中循环(嵌套循环)。考虑下面的代码: ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it for(int i : list) { // ConcurrentModificationException Iterator iterator = list.iterator(); while(iterator.hasNext(

我正在尝试遍历一个列表,同时已经在其中循环(嵌套循环)。考虑下面的代码:

ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it

for(int i : list) { // ConcurrentModificationException

   Iterator iterator = list.iterator();

   while(iterator.hasNext()) {

      int n = iterator.next();

      if(n % i == 0) {
         iterator.remove();
      }

   }

}
ArrayList list=new ArrayList();//给它添加一些值
对于(int i:list){//ConcurrentModificationException
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
iterator.remove();
}
}
}
上面的示例导致ConcurrentModificationException。当然,删除元素的条件只是一个示例


我确信我只是错过了一些东西;但是我应该如何构造一个循环,在Java中实现相同的功能而不引发异常?

您不能从正在迭代的列表中删除一个项。一个选项是将您需要的项目添加到另一个列表中。最后,你有一个清单,上面有你需要的物品。或者您可以迭代原始列表的克隆。

您将获得
ConcurrentModificationException
,因为在执行
for
循环时,您正在尝试修改
列表

我不确定以下是否是一个优雅的解决方案,但类似于以下的方法可能会奏效:

       Iterator<Integer> iterator = list.iterator();
            int i=1;
            while (iterator.hasNext()) {

                int n = iterator.next();

                if (n % i == 0) {
                    iterator.remove();
                }
                i++;
            }
Iterator Iterator=list.Iterator();
int i=1;
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
iterator.remove();
}
i++;
}

我做的事情和你很相似。请看一下这个密码

out:for(int h=0; h<tempAl.size(); h++) {
                        if(tempAl.get(0).split("\\s")[0].equals("OFF")){
                            tempAl.remove(0);
                            h=-1;
                            continue;
                        }
                        if(tempAl.get(h).split("\\s")[0].equals("ON")){
                            ONTime= tempAl.get(h);
               ///rest fof the code
    }

out:for(int h=0;h当您在列表上迭代时,明显地修改列表,导致执行选项。
您可以使用另一个列表来维护要删除的元素列表,并在最后删除它们

ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it
ArrayList<Integer> del = new ArrayList<Integer>(); // Elements to be deleted

for(int i : list) { // ConcurrentModificationException
   Iterator iterator = list.iterator();
   while(iterator.hasNext()) {    
      int n = iterator.next();
      if(n % i == 0) {
          del.add(n);      
      }
   }
}

list.removeALL(del);
ArrayList list=new ArrayList();//向其中添加一些值
ArrayList del=新建ArrayList();//要删除的元素
对于(int i:list){//ConcurrentModificationException
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
del.add(n);
}
}
}
列表。删除所有(del);

我没有尝试过,但可以使用:

List<Integer> list = new ArrayList<Integer>(); 
// add some values to it  
for(Iterator<Integer> iterator1 = list.iterator(); iterator1.hasNext();) { 
    int i = iterator1.next();
    for(Iterator<Integer> iterator2 = list.iterator(); iterator2.hasNext();){
        int n = iterator.next();        
        if(n % i == 0) {          
            iterator2.remove();       
        }     
    }  
} 
List List=new ArrayList();
//给它添加一些值
对于(迭代器迭代器1=list.Iterator();迭代器1.hasNext();){
int i=iterator1.next();
for(迭代器迭代器2=list.Iterator();迭代器2.hasNext();){
int n=迭代器.next();
如果(n%i==0){
迭代器2.remove();
}     
}  
} 
或者,如果仍然抛出ConcurrentModificationException(我不确定如果使用同一列表支持的2个迭代器会发生什么),那么使用:

List<Integer> list = new ArrayList<Integer>(); 
// add some values to it  
for(int i : new ArrayList(list)){ // copy list 
    ...
}
List List=new ArrayList();
//给它添加一些值
对于(inti:newarraylist(list)){//复制列表
...
}

foreach
java语法隐藏迭代器,但在隐藏迭代器时,无法在此迭代器上调用
remove
方法

因此,我会:

ArrayList<Integer> list = new ArrayList<Integer>(); // add some values to it

int count = 0;
for(Iterator<Integer> it = list.iterator();it.hasNext();count++){ //increments count++
   Integer currentInt = it.next();
   if(currentInt % count == 0){
     it.remove();
   }
}
ArrayList list=new ArrayList();//向其中添加一些值
整数计数=0;
for(Iterator it=list.Iterator();it.hasNext();count++){//递增count++
整数currentInt=it.next();
如果(currentInt%count==0){
it.remove();
}
}
您可以看到,在不需要辅助迭代器的情况下实现了相同的功能

您不能在同一时间遍历同一列表。 总之,
modcount
变量用于在每次并行更改或迭代列表时检测自身的意外更改。 从而导致
ConcurrentModificationException
。 它经常出现在多线程环境中,开发人员必须意识到这一点

此外,更喜欢使用
for
循环,而不是
循环来迭代集合

为什么?

因为使用
while
方式,循环后迭代器对象仍在作用域中,而使用
for
则不会。对
it.next()
的简单确认调用将以
无切理异常
结束


最好的做法是保持;)

使外部迭代在列表的副本上迭代

for (int i : new ArrayList<>(list)) {

  Iterator<Integer> iterator = list.iterator();

  while (iterator.hasNext()) {

    int n = iterator.next();

    if (n % i == 0) {
      iterator.remove();
    }

  }

}
for(inti:newarraylist(list)){
迭代器迭代器=list.Iterator();
while(iterator.hasNext()){
int n=迭代器.next();
如果(n%i==0){
iterator.remove();
}
}
}

非常感谢对问题标题的任何建议。问题是我需要使用列表中的数字进行比较。因此,a
i=1;i++
不会这样做,因为数字不是1,2,3等。您使用迭代器获取列表中的数字,那么为什么需要循环?我正在学习Java,但迭代器不会迭代项(在本例中为列表)的值吗?我需要对每个列表值进行循环,这迫使我使用嵌套循环。这是否意味着列表中的每个项都是另一个列表还是什么?错误。。。这不应该是
del.add(n)
?这就是我要寻找的,但是,我需要在while循环完成后立即执行元素删除,也就是说,在每个for循环结束时。@Zar您也可以这样做。只需将
del
列表声明移动到循环中,并在每次迭代后删除。第一个解决方案仍然存在ConcurrentModificationException:-(