Java 调整元素列表大小时的ConcurrentModificationException

Java 调整元素列表大小时的ConcurrentModificationException,java,Java,我正在一个循环中从列表中删除元素,而这个列表正在另一个循环中迭代ConcurrentModificationException。有办法解决这个问题吗? 关键是我已经有了一个循环,基于某些条件,我必须减小它的大小,修改后它应该根据列表的新大小进行迭代列表修改正在另一个循环中进行。 static List<String> list = new ArrayList<>(); private static void initilizeList() { for(int i

我正在一个循环中从列表中删除元素,而这个列表正在另一个循环中迭代<应为代码>ConcurrentModificationException。有办法解决这个问题吗? 关键是我已经有了一个循环,基于某些条件,我必须减小它的大小,修改后它应该根据列表的新大小进行迭代列表修改正在另一个循环中进行。

static List<String> list = new ArrayList<>();

private static void initilizeList() {
    for(int i = 0; i < 10; i++){
        list.add(String.valueOf(i));
    }
}

private static void iterateList() {
    for(String s: list){
        System.out.println(s);
        if(s.equals("5")){
            modifyList();
        }
    }
}

private static void modifyList() {
    for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
        String element = iterator.next();
        if (element.equalsIgnoreCase("5")) {
            break;
        }
        iterator.remove();
    }
}
static List=new ArrayList();
私有静态void initilizeList(){
对于(int i=0;i<10;i++){
list.add(String.valueOf(i));
}
}
私有静态void iterateList(){
用于(字符串s:列表){
系统输出打印项次;
如果(s.等于(“5”)){
modifyList();
}
}
}
私有静态void modifyList(){
for(Iterator Iterator=list.Iterator();Iterator.hasNext();){
String元素=迭代器.next();
if(元素等信号情况(“5”)){
打破
}
iterator.remove();
}
}

如果使用迭代器删除元素,迭代器将始终根据列表的新大小继续迭代。它不会重新开始,但会在列表的最后一个元素处停止

我对modifyList()中的循环有点困惑。您正在列表的迭代器上进行for循环迭代。如果您的目标只是删除元素“5”,那么我会这样做:

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class Iterating {

  static List<String> list = new ArrayList<>();

  private static void initilizeList() {
      for(int i = 0; i < 10; i++){
          list.add(String.valueOf(i));
      }
  }

  private static void modifyList() {
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String element = iterator.next();
        if (element.equalsIgnoreCase("5")) {
            iterator.remove();
        }
    }
  }

  public static void main(String[] args) {
    initilizeList();
    System.out.println("Before: " + list);
    modifyList();
    System.out.println("After: " + list);
  }
}
如果您的目标是删除“5”之前的所有元素,则可以使用
列表中的方法:

  private static void reduceList() {
    int i = list.indexOf("5");
    if (i > -1)
      list = new ArrayList<String>(list.subList(i, list.size()));
  }

这回答了你的问题吗?在外部循环中修改列表。里面有另一个循环并不重要。
  private static void reduceList() {
    int i = list.indexOf("5");
    if (i > -1)
      list = new ArrayList<String>(list.subList(i, list.size()));
  }
Before: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
After: [5, 6, 7, 8, 9]