在优先级队列中删除

时间:2015-03-12 09:02:24

标签: java android data-structures

我有一个代码(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)
       }

}

1 个答案:

答案 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)),如果这成为问题,您可能需要将设计更改为:

  1. 使用TreeSet或完全有序的数据结构
  2. 不是标记要删除的项目,而是标记要保留的项目 - 而不是删除它们 - 而是使用这些项目构建新的PriorityQueue。