2014-02-11 2 views
0

Требование: У меня есть очереди Max-Priority с п элементов. Теперь я хочу, чтобы сохранить только м -Максимальных элементов (где м < = п) и падают остальные из очереди. Другими словами, я хочу обрезать очередь.Обрежьте приоритетной очереди

Как это достичь?

Один из способов, который я мог придумать это, вывода из м элементы и поместить их в другую очередь. Затем назначьте ссылку новой очереди на ссылку старой очереди.

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; 
} 

Нет ли лучшего способа сделать это? Я бы предпочел, если есть способ обрезать рабочую очередь, не создавая новый объект-очередь.

+0

Вы используете объект, так что вам не нужно возвращать PriorityQueue из этой функции ... я бы просто деактивировал элементы X, а затем класс, вызывающий эту функцию, мог бы использовать «обрезанную» очередь после этого – Crasher

+0

И когда вы узнаете это M? Можете ли вы просто вставить в то время как меньше, чем newSize? – Crasher

+0

Спасибо за помощь Crasher :) Когда мы называем 'Dequeue()', мы ** упускаем ** ** максимальные ** m элементов, правильно? Я не хочу их бросать. Я хочу сбросить ** минимальные элементы ** m. – Dilini

ответ

1

PriorityQueue реализует IEnumerable интерфейс, так что вы можете использовать, что в сочетании с методом Linq расширения Последняя():

while (paraQueue.Count > newSize) 
{ 
    paraQueue.Remove(paraQueue.Last()); 
} 
+0

Спасибо Håkan! Это похоже на лучший способ, чем создание другого объекта очереди. – Dilini

0

Я хотел бы сделать что-то вроде этого:

public static void TrimPQueue(PriorityQueue<int> paraQueue, int newSize) 
{ 
    if (newSize >= paraQueue.Count) 
     return ; 
    for (int i = 1; i < newSize + 1; i++) 
     paraQueue.Dequeue(); 
} 

Потому что вы не должны сделать копию, если вы все еще изменения текущей очереди.

+1

Это удалит первые элементы в очереди. Это n-m последних элементов, которые нужно удалить, если я правильно понял вопрос. –

+0

@ HåkanFahlstedt Вы правы. Во всяком случае, спасибо Crasher за вклад. – Dilini

+0

Извините, ребята .. Я принял идею xD – Crasher

Смежные вопросы