要求: 我有一个带有 n 元素的最大优先级队列。现在我想只保留 m 最大元素(其中 m<=n)并将其余元素从队列中删除。换句话说,我想修剪队列。
我如何实现这一目标?
我能想到的一种方法是,将 m 元素出队并将它们放入另一个队列中。然后将新队列的引用分配给旧队列的引用。
public static PriorityQueue<int> TrimPQueue(PriorityQueue<int> paraQueue, int newSize)
{
if (newSize >= paraQueue.Count)
return paraQueue;
PriorityQueue<int> newQueue = new PriorityQueue<int>(PriorityQueueType.Maximum);
for (int i = 1; i < newSize + 1; i++)
{
int temp = paraQueue.Dequeue();
newQueue.Add(temp);
}
return newQueue;
}
没有更好的方法吗?我希望有一种方法可以修剪工作队列,而不必创建新的队列对象。
PriorityQueue 实现了 IEnumerable 接口,因此您可以将其与 Linq 扩展方法 Last() 结合使用:
while (paraQueue.Count > newSize)
{
paraQueue.Remove(paraQueue.Last());
}