我需要根据ID更新PriorityQueue中的一些固定优先级元素。我认为这是一个很常见的场景,下面是一个示例片段(Android 2.2):
for (Entry e : mEntries) {
if (e.getId().equals(someId)) {
e.setData(newData);
}
}
我随后使条目 "immutable"(没有设置器方法),以便通过 setData() 创建并返回新的 Entry 实例。我将我的方法修改为以下内容:
for (Entry e : mEntries) {
if (e.getId().equals(someId)) {
Entry newEntry = e.setData(newData);
mEntries.remove(e);
mEntries.add(newEntry);
}
}
代码似乎运行良好,但有人指出在迭代队列时修改它是一个坏主意:这可能会抛出ConcurrentModificationException异常,我需要将要删除的元素添加到ArrayList中并稍后删除它。他没有解释原因,而且对我来说看起来是很大的开销,但我在互联网上找不到任何具体的解释。
(此帖类似,但优先级可以改变,这不是我的情况)
有人能澄清一下我的代码有什么问题,我应该如何更改,最重要的是为什么?
谢谢, Rippel
PS:一些实现细节...
PriorityQueue<Entry> mEntries = new PriorityQueue<Entry>(1, Entry.EntryComparator());
使用:
public static class EntryComparator implements Comparator<Entry> {
public int compare(Entry my, Entry their) {
if (my.mPriority < their.mPriority) {
return 1;
}
else if (my.mPriority > their.mPriority) {
return -1;
}
return 0;
}
}