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);
}