【问题标题】:Deletion in Priority Queue优先队列中的删除
【发布时间】:2015-03-12 09:02:23
【问题描述】:

我有一个代码 (Andorid),它遍历优先级队列并删除所有具有特定 ID 的条目。

但是,它只删除第一个实例并跳过其余实例。例如,

(abc 1) (定义 2) (ghi 3) (jkl 1) (mno 3)

如果给定的 id 是 1。它只删除 abc 并且队列被重新组织并将 jkl 留在其中。我也厌倦了迭代器,但没用。

for(SomeMessage message : priorityQueue){

          if(message.id == dead_sender.id){
                      priorityQueue.remove(message)
       }

}

【问题讨论】:

  • 这段代码真的有效吗?不应该。

标签: java android data-structures


【解决方案1】:

您不能在 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。

【讨论】:

  • 或者,就此而言,根本不标记,而是在迭代旧结构的同时构建新结构。还有一些称为优先级搜索队列的结构,它支持高效的优先级队列操作和高效的搜索。
  • @dfeuer 无论如何,这实际上取决于需要删除多少项目-答案的一部分应该涵盖这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2019-03-19
  • 1970-01-01
  • 2012-03-06
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多