【发布时间】:2011-08-18 10:25:24
【问题描述】:
我需要根据它们的 ID 更新 PriorityQueue 中的一些固定优先级元素。我认为这是一个很常见的场景,这里有一个示例 sn-p (Android 2.2):
for (Entry e : mEntries) {
if (e.getId().equals(someId)) {
e.setData(newData);
}
}
然后我将Entry 设置为“不可变”(没有setter 方法),以便创建一个新的Entry 实例并由setData() 返回。我将我的方法修改为:
for (Entry e : mEntries) {
if (e.getId().equals(someId)) {
Entry newEntry = e.setData(newData);
mEntries.remove(e);
mEntries.add(newEntry);
}
}
代码似乎工作正常,但有人指出,在迭代队列时修改队列是个坏主意:它可能会引发 ConcurrentModificationException,我需要将要删除的元素添加到 ArrayList 并删除稍后。他没有解释原因,对我来说这似乎是一个很大的开销,但我在互联网上找不到任何具体的解释。
(This post 类似,但优先级可以改变,这不是我的情况)
谁能澄清我的代码有什么问题,我应该如何更改它以及 - 最重要的是 - 为什么?
谢谢, 涟漪
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;
}
}
【问题讨论】:
-
可能创建一个堆栈,然后在完成后将所需的元素添加到那里。
标签: java android priority-queue