public static ArrayList<Job> ready = new ArrayList<Job>();
...later on....
ArrayList<Job> temp = ready;
for (Iterator<Job> iterator = temp.iterator(); iterator.hasNext(); ) {
Job j = (Job) iterator.next();
if (j.number == number) {
ready.remove(j);
ready.add(j);
system.devices-=devices;
j.devices+=devices;
iterator.remove();
}
}
为什么会抛出错误?当然,ready = temp,但我正在迭代temp,我不会改变temp。我怎样才能解决这个问题呢?
答案 0 :(得分:1)
temp
是对ready
的引用,ready
的迭代器会看到temp
的所有更改。您实际上可以使用Collections.copy
ArrayList<Job> temp = new ArrayList<Job>();
Collections.copy( temp, ready );
答案 1 :(得分:1)
您正在尝试在迭代时更改列表。 temp
和ready
是相同的列表 - 更改一个更改另一个列表。如果您想复制列表,可以使用temp = new ArrayList<Job>(ready)
。
答案 2 :(得分:0)
您正在尝试在循环时修改集合,并且此节点无法支持此类操作。 您有两种不同的解决方案: 1-将集合复制到另一个集合,并基于一个循环并修改另一个集合。 2-最佳实践是使用并发集合,例如: CopOnWriteArrayList,ConcurrentSkipListMap
答案 3 :(得分:-2)
您在迭代时通过添加和删除元素来改变列表,这不是一个好主意......
改为放置符合条件的元素
if (j.number == number) {
在另一个列表中,并执行了temp.removeAll(c);