我需要根據其ID來更新PriorityQueue中的某些固定優先級元素。我認爲這是一個相當常見的場景,這裏是一個示例代碼段(安卓2.2):迭代時更新PriorityQueue
for (Entry e : mEntries) {
if (e.getId().equals(someId)) {
e.setData(newData);
}
}
我再發條目「不可改變」(沒有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是相似的,但有優先級可以改變的,這不是我的情況)
誰能弄清楚什麼是錯我的代碼,我應該怎麼改變它, - 最重要的是 - 爲什麼?
感謝, 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;
}
}
也許創建一個堆棧,然後在完成後將想要的元素添加到那裏。 – Matt