Java 如何从ListIterator中删除所有元素,然后添加新元素

Java 如何从ListIterator中删除所有元素,然后添加新元素,java,iterator,Java,Iterator,如何从列表迭代器中删除所有元素,然后添加新元素。在最后一行添加到迭代器时,我得到了ConcurrentModificationException public static void doAction(List<String> list) { for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext(); ) { String s1 = iterator.n

如何从
列表迭代器中删除所有元素,然后添加新元素。在最后一行添加到迭代器时,我得到了
ConcurrentModificationException

public static void doAction(List<String> list) {
    for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext(); ) {
        String s1 = iterator.next();
        if(s1.equals("XYZ")){
            while(iterator.hasNext()) {
                iterator.next();
                iterator.remove();
            }
            list.add("123");
            list.add("456");
            list.add("789");
            list.forEach(iterator::add);
        }
    }
}
publicstaticvoiddoAction(列表){
for(ListIterator迭代器=list.ListIterator();iterator.hasNext();){
字符串s1=迭代器.next();
如果(s1等于(“XYZ”)){
while(iterator.hasNext()){
iterator.next();
iterator.remove();
}
列表。添加(“123”);
列表。添加(“456”);
列表。添加(“789”);
forEach(迭代器::add);
}
}
}

出现异常的原因是,您在迭代列表时试图将其添加到列表中<代码>列表#forEach
将快速失败,并且仍将在迭代过程中对基础列表中的
ConcurrentModificationException
进行结构修改(即在您的情况下,
迭代器::add
操作)

现在,出于您想要实现的目的,可以像这样重新编写和修改您的方法:

public static void doAction(List<String> list) {
     if (list.contains("XYZ")) {
         list.clear();
         list.add("123");
         list.add("456");
         list.add("789");
     }
}
publicstaticvoiddoAction(列表){
if(列表包含(“XYZ”)){
list.clear();
列表。添加(“123”);
列表。添加(“456”);
列表。添加(“789”);
}
}

这是更直接,更容易遵循。您只需检查您要查找的值是否存在于给定列表中,然后只需调用
list#clear
即可清空传入的值。然后,您将添加新元素,就可以开始了。

要执行您想要执行的操作,请进行所需的更改


    List<String> list = ArrayList<>(List.of("ABC","DEF", "GHI", "XYZ", "JKL", "MNO"));

    public static void doAction(List<String> list) {
        for (ListIterator<String> iterator = list.listIterator(); iterator.hasNext(); ) {
            String s1 = iterator.next();
            if(s1.equals("XYZ")){
                while(iterator.hasNext()) {
                    iterator.next();
                    iterator.remove();
                }
                list.add("123");
                list.add("456");
                list.add("789");
                break;            // add this
           //     list.forEach(iterator::add);  // delete this
            }
        }
    }


列表列表=数组列表(列表中的“ABC”、“DEF”、“GHI”、“XYZ”、“JKL”、“MNO”);
公共静态无效操作(列表){
for(ListIterator迭代器=list.ListIterator();iterator.hasNext();){
字符串s1=迭代器.next();
如果(s1等于(“XYZ”)){
while(iterator.hasNext()){
iterator.next();
iterator.remove();
}
列表。添加(“123”);
列表。添加(“456”);
列表。添加(“789”);
break;//添加这个
//list.forEach(迭代器::add);//删除此
}
}
}
它会打印

[ABC,DEF,GHI,XYZ,123456789]

但我相信一个更干净的方法是

     List<String> list = ArrayList<>(List.of("ABC","DEF", "GHI", "XYZ", "JKL", "MNO"));

     public static void doAction(List<String> list) {
        ListIterator<String> it = list.listIterator();
        while (it.hasNext()) {
            if (it.next().equals("XYZ")) {
                while (it.hasNext()) {
                    it.next();
                    it.remove();
                }
            }
        }
        list.add("123");
        list.add("456");
        list.add("789");
     }

List List=ArrayList(列表中的“ABC”、“DEF”、“GHI”、“XYZ”、“JKL”、“MNO”);
公共静态无效操作(列表){
ListIterator it=list.ListIterator();
while(it.hasNext()){
if(it.next().equals(“XYZ”)){
while(it.hasNext()){
it.next();
it.remove();
}
}
}
列表。添加(“123”);
列表。添加(“456”);
列表。添加(“789”);
}