【发布时间】:2014-07-07 02:58:22
【问题描述】:
我一直在尝试了解 Iterators 的工作原理,并且在我的测试中,我多次遇到 java.util.ConcurrentModificationException。因为我发现当 Iterator 运行通过 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");
}
}
我在if(!itr.next().equals(finder.next())) 中得到Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException。我知道问题可能是因为我正在向different_value ArrayList 添加值,但我想要做的是迭代value ArrayList 并将前一个获取的不同值存储在different_value ArrayList 中。
脚注:我还发现不建议在通过 ArrayList 使用迭代器时更改 ArrayList 中的值。我应该使用更简单的foreach: 方法吗?
【问题讨论】:
-
不仅“不推荐”,而且不允许(只要您使用迭代器,无论如何)。并且 for-each 循环也会失败,因为无论如何它们都在幕后使用迭代器。
-
长话短说,使用
ListIterator,并通过迭代器进行修改,不通过改变数组本身。 -
你正在为自己努力。只需使用迭代器迭代原始列表,并为遇到的每个实例添加类似的内容: if ( !list2.contains(iterationElement)){ list2.add(iterationElement); }
-
感谢大家快速而出色的回答。我选择为 this.value 中的每个 String 元素使用 a,检查 this.different_value.contains 是否包含该元素,如果不是,则将其添加到列表中。我不知道 ArrayList 的 contains 方法,这很有帮助。非常感谢@Stultuske。最终隐式使用了迭代器,就像 user3580294 只在 for each 中所说的那样。