我一直在努力了解 Iterators 是如何工作的,而在我的测试中,我很多时候都会遇到 java.util.ConcurrentModificationException 。我发现当迭代器通过 ArrayList 运行时会发生这种情况,并且突然发生其值的变化。在我认为在事件处理程序中调用运行 Iterator 的方法时,也会发生这种情况。在我的代码中都发生了。
我知道在调用事件处理程序中的方法时我应该在后台线程中运行代码,但我宁愿不这样做,因为我们没有在我参加的课程中讨论这个问题(必要时会这样做)。
目前我有这个:
import java.util.ArrayList;
import java.util.Iterator;
public class Node {
private ArrayList<String> value = new ArrayList<String>();
private ArrayList<String> different_value = new ArrayList<String>();
private int differentK = 0;
public Node (Tabela table, int column){
for (int i = 1; i<table.get_numLines(); i++){
this.value.add(table.out[column][i]);
}
Iterator<String> itr = this.value.iterator();
Iterator<String> finder = this.different_value.iterator();
if(this.value.size()!=0) this.different_value.add(this.value.get(0));
while(itr.hasNext()){
while(finder.hasNext()){
if(!itr.next().equals(finder.next())){
this.differentK++;
this.different_value.add(itr.next());
}
}
}
System.out.println("This node has "+this.differentK+" different K");
}
}
我在Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
获得if(!itr.next().equals(finder.next()))
。我知道问题可能是因为我正在向different_value
ArrayList添加值,但我想要做的是迭代value
ArrayList并将前一个采用的不同值存储在{{1}中} ArrayList。
FootNote:我还发现,当通过 ArrayList 使用迭代器时,不建议更改ArrayList中的值。我应该使用更简单的different_value
方法吗?
答案 0 :(得分:0)
我认为如果list2中不存在,则要将list1(value)中的元素添加到list2(different_value)。
第一个评论查找器迭代器
//Iterator<String> finder = this.different_value.iterator();
然后使用其他循环代替迭代器,例如for-loop
while (itr.hasNext()) {
String current = itr.next();
boolean exists = false;
for (int i = 0; i < different_value.size(); i++) {
if (current.equals(different_value.get(i))) {
exists = true;
break;
}
}
if (!exists) {
different_value.add(current);
}
}
这应该可以解决你的问题。不允许在迭代时添加列表中的元素。