Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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_Concurrentmodification - Fatal编程技术网

Java 如何在迭代列表时向列表中添加值

Java 如何在迭代列表时向列表中添加值,java,concurrentmodification,Java,Concurrentmodification,我有这样一个场景 List<String> xxx = new ArrayList for(String yyy : xxx){ for(String zzz:xyxy){ if(!zzz.equals(yyy)){ xxx.add(zzz); } } } List xxx=新数组列表 for(字符串yyy:xxx){ 用于(字符串zzz:xyxy){ 如果(!zzz.等于(yyy)){ xxx.添加(zzz); } } } 但是我得

我有这样一个场景

List<String> xxx = new ArrayList
for(String yyy : xxx){
   for(String zzz:xyxy){
     if(!zzz.equals(yyy)){
       xxx.add(zzz);
     }
   }
}
List xxx=新数组列表
for(字符串yyy:xxx){
用于(字符串zzz:xyxy){
如果(!zzz.等于(yyy)){
xxx.添加(zzz);
}
}
}
但是我得到了java.util.ConcurrentModificationException:null异常。有人能帮我解决这个问题吗。?有人能给我其他方法来执行此操作吗?

查看:

这个类的迭代器和listIterator方法返回的迭代器是快速失效的:如果在迭代器创建后的任何时候,列表在结构上被修改,除了通过迭代器自己的remove或add方法,迭代器将抛出ConcurrentModificationException

因此,您需要显式地获得一个
ListIterator
,并使用它来正确地修改
ArrayList
。另外,我不认为可以使用for-each循环,因为这些循环中的迭代器与显式检索的迭代器是分开的。我认为您必须使用while循环:

List<String> xxx = new ArrayList<>();
ListIterator<String> iterator = xxx.listIterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    for (String zzz : xyxy) {
        if (!zzz.equals(s)) {
            iterator.add(zzz); //<-- Adding is done through the iterator
        }
    }
}
List xxx=new ArrayList();
ListIterator迭代器=xxx.ListIterator();
while(iterator.hasNext()){
字符串s=迭代器.next();
用于(字符串zzz:xyxy){
如果(!zzz.等于){

迭代器.add(zzz);//将它们添加到另一个列表中,然后将该列表添加到
xxx

List<String> xxx = new ArrayList<>();
List<String> additional = new ArrayList<>();
for (String yyy : xxx) {
    for (String zzz : xyxy) {
        if (!zzz.equals(yyy)) {
            additional.add(zzz);
        }
    }
}
xxx.addAll(additional);
List xxx=new ArrayList();
List additional=new ArrayList();
for(字符串yyy:xxx){
用于(字符串zzz:xyxy){
如果(!zzz.等于(yyy)){
增加(zzz);
}
}
}
xxx.添加所有(附加);

不要使用foreach循环,而是使用普通循环,如:

int originalSize=xxx.size();
for (int i=0;i<originalSize;i++) {
    xxx.add("New string appended at the end");
}
int originalSize=xxx.size();

对于(int i=0;i,这意味着您不能同时访问和修改集合(列表)。为此,您必须使用迭代器。我不明白代码中的xyxy是什么。但元素的可能迭代和设置可能如下所示

        List<String> xxx = new ArrayList<String>();

        xxx.add("hello");
        xxx.add("hi");
        xxx.add("hh");

        ListIterator<String> it = xxx.listIterator();
        while (it.hasNext()) {

            if (!it.next().equals("hi")) {
                it.remove();
                it.add("hi");

            }
        }

        System.out.println(xxx);
          }
      }
List xxx=new ArrayList();
xxx.添加(“你好”);
xxx.添加(“hi”);
xxx.添加(“hh”);
ListIterator it=xxx.ListIterator();
while(it.hasNext()){
如果(!it.next().equals(“hi”)){
it.remove();
添加(“hi”);
}
}
系统输出打印项次(xxx);
}
}

要在迭代时修改列表,可以将arraylist声明为“java.util.concurrent.CopyOnWriteArrayList

publicstaticvoidmain(字符串[]args){
List xxx=新的CopyOnWriteArrayList();
xxx.添加(“3”);
xxx.添加(“4”);
列表xyxy=新的ArrayList();
xyxy.添加(“1”);
xyxy.添加(“2”);
xyxy.添加(“3”);
for(字符串yyy:xxx){
用于(字符串zzz:xyxy){
如果(!zzz.等于(yyy)){
xxx.添加(zzz);
}
}
}
系统输出打印项次(xxx);
}

你到底想做什么?顺便说一句,你需要学习变量命名技巧。你的示例代码很难理解,仅仅是因为非描述性名称。不要这样做!
xxx.size()
正在更改,而
originalSize
保持不变。@ginz这是故意的!只对列表中最初包含的项(而不是循环过程中添加的新项)进行迭代这与作者代码中的行为不同。操作的目的并没有真正指定。但是,如果您通过检查xxx.size()设置结束循环的条件,则有无限循环的风险(如果您继续添加新项)。我相信这仍然会抛出一个
ConcurrentModificationException
,因为您仍然在以一种不是通过迭代器本身的方式修改
ArrayList
。感谢您指出,编辑了代码。然而,根据在线API,迭代器不会反映自创建迭代器以来对列表的添加、删除或更改"。这可能会有问题,具体取决于OP想要什么。此外,
CopyOnWriteArrayList
s对于性能来说是可怕的,如果您的读操作数不超过写操作数。当修改的数量与遍历操作的数量相比是最小的时候,CopyOnWriteArrayList将有效。这里的情况似乎不是这样的……不是吗hanks bro..它像宝石一样工作…!上面每个循环的xyxy是什么?@Rajper我想它是某种
Iterable
。它是什么具体的类型,我不知道。它在最初的问题中,所以我就这样离开了。是的,肯定是某种字符串集合,但我想问的是;它必须声明或初始化在片段中的某个地方被忽略了。@Rajper我想丢失的声明只是被遗忘了或是其他什么东西。对于这个问题来说,这不是一个重要的细节。
public static void main(String[] args) {
    List<String> xxx = new CopyOnWriteArrayList();
    xxx.add("3");
    xxx.add("4");

    List<String> xyxy = new ArrayList();
    xyxy.add("1");
    xyxy.add("2");
    xyxy.add("3");

    for (String yyy : xxx) {
        for (String zzz : xyxy) {
            if (!zzz.equals(yyy)) {
                xxx.add(zzz);
            }
        }
    }

    System.out.println(xxx);
}