Я знаю, что PriorityQueue
автоматически сортирует элементы при использовании метода add()
, используя метод «compareTo()
». Предположим, я хочу в какой-то момент изменить приоритет элемента в очереди. Как явным образом закажу PriorityQueue
для сортировки себя снова, учитывая, что приоритет элемента изменился?Изменение приоритета элемента в PriorityQueue
ответ
Удалите объект, измените его приоритет и повторно добавьте его в очередь.
Моя интуиция заключается в том, что структура данных обычно не смотрит внутреннее состояние объектов и требует, чтобы операция add() или remove() вызывала повторный вызов компаратора. Вызов функции Collections.sort() также будет работать, но вам придется преобразовать очередь в список, а затем вернуться в очередь. Это может иметь больше смысла, если вы одновременно измените множество приоритетов.
Лучше, вы можете обновить n приоритетов, а затем добавить и удалить последний.
Нет ли другого способа? – Pickle
@Pickle .... действительно. –
Единственный вариант - удалить, изменить и добавить обратно свой объект. PriorityQueue
не обновляет внутреннюю структуру при чтении. Вот implimentation из peek()
, например:
public E peek() {
if (size == 0)
return null;
return (E) queue[0];
}
Как вы могли видеть, не проверяет, если элементы заказ был изменен.
Спасибо, вот что я тоже подумал. – Pickle
Удалите элемент, измените его значение приоритета, повторно добавьте его. –
Возможный дубликат [Переупорядочение очереди приоритетов Java при редактировании элементов] (http://stackoverflow.com/questions/6952660/java-priority-queue-reordering-when-editing-elements) – Raedwald
Возможный дубликат http: // stackoverflow. com/questions/1871253/update-java-priorityqueue-when-its-elements-change-priority – Raedwald