2015-03-20 4 views
2

Я знаю, что PriorityQueue автоматически сортирует элементы при использовании метода add(), используя метод «compareTo()». Предположим, я хочу в какой-то момент изменить приоритет элемента в очереди. Как явным образом закажу PriorityQueue для сортировки себя снова, учитывая, что приоритет элемента изменился?Изменение приоритета элемента в PriorityQueue

+0

Удалите элемент, измените его значение приоритета, повторно добавьте его. –

+0

Возможный дубликат [Переупорядочение очереди приоритетов Java при редактировании элементов] (http://stackoverflow.com/questions/6952660/java-priority-queue-reordering-when-editing-elements) – Raedwald

+0

Возможный дубликат http: // stackoverflow. com/questions/1871253/update-java-priorityqueue-when-its-elements-change-priority – Raedwald

ответ

1

Удалите объект, измените его приоритет и повторно добавьте его в очередь.

Моя интуиция заключается в том, что структура данных обычно не смотрит внутреннее состояние объектов и требует, чтобы операция add() или remove() вызывала повторный вызов компаратора. Вызов функции Collections.sort() также будет работать, но вам придется преобразовать очередь в список, а затем вернуться в очередь. Это может иметь больше смысла, если вы одновременно измените множество приоритетов.

Лучше, вы можете обновить n приоритетов, а затем добавить и удалить последний.

+0

Нет ли другого способа? – Pickle

+0

@Pickle .... действительно. –

1

Единственный вариант - удалить, изменить и добавить обратно свой объект. PriorityQueue не обновляет внутреннюю структуру при чтении. Вот implimentation из peek(), например:

public E peek() { 
    if (size == 0) 
     return null; 
    return (E) queue[0]; 
} 

Как вы могли видеть, не проверяет, если элементы заказ был изменен.

+0

Спасибо, вот что я тоже подумал. – Pickle