我有一个代码(Andorid),它遍历优先级队列并删除具有特定id的所有条目。
但是,它只删除第一个实例并跳过其余实例。例如,
(abc 1) (def 2) (ghi 3) (jkl 1) (mno 3)
如果给定的id是1.它只删除abc并重新组织队列并在其中留下jkl。我也厌倦了迭代器,但没有用。
for(SomeMessage message : priorityQueue){
if(message.id == dead_sender.id){
priorityQueue.remove(message)
}
}
答案 0 :(得分:3)
您不能在for-each循环中迭代集合并在执行此操作时从中删除元素。
您应该在迭代时为“要删除的项目”创建单独的集。完成后,迭代这个新集合,删除原始集合中的每个项目。
类似的东西:
List<SomeMessage> toRemove = new ArrayList<>();
for(SomeMessage message : priorityQueue){
if(message.id == dead_sender.id){
toRemove.add(message);
}
}
for (SomeMessage message : toRemove) {
priorityQueue.remove(message)
}
但请注意,删除优先级队列的任意元素(而不是头部)是一项昂贵的任务(O(n)
),如果这成为问题,您可能需要将设计更改为:
TreeSet
或完全有序的数据结构