我从go documentation完全实现了优先级队列。 我想删除元素,如果它们满足某些条件。所以我应该:
像这样:
for i, value := range pq{
if someCondtion{
heap.Remove(&pq, i)
}
}
或者为了简单起见:
for i, value := range pq{
heap.Remove(&pq, i)
}
但这不是安全的方法,因为有一个错误:
panic: runtime error: index out of range
goroutine 1 [running]:
main.PriorityQueue.Swap(...)
main.(*PriorityQueue).Swap(0xc420088020, 0x2, 0x0)
container/heap.Remove(0x4c69a0, 0xc420088020, 0x2, 0xf, 0x0)
我该怎么做呢? 以下是https://play.golang.org/p/XrQdAJIbZPw
的示例答案 0 :(得分:3)
每次调用heap.Remove
后,都会重新组织堆。因此pq
的初始长度在每个循环中变小。当它小于i
要求的当前值时,您将达到该点。
如果你操纵pq
,你必须按照例子中的方式循环:
for pq.Len() > 0 {
item := heap.Pop(&pq).(*Item)
fmt.Printf("%.2d:%s\n", item.priority, item.value)
}
答案 1 :(得分:3)
我认为您没有正确使用正确的数据结构或使用的数据结构。队列的想法是将项目放在最后以供将来处理,并从头开始处理项目以处理它们。
如果您不想处理某些项目,您可以在排队之前对其进行过滤,也可以在处理之前从队列中进行过滤。