PriorityQueue
Очередь, которая всегда выдаёт наименьший (или самый приоритетный) элемент.
Доступно с: Java 1.5
Синтаксис
public class PriorityQueue<E> extends AbstractQueue<E>Примеры
Числа выходят по возрастанию:
void main() {
Queue<Integer> pq = new PriorityQueue<>(List.of(5, 1, 8, 3));
while (!pq.isEmpty()) {
IO.print(pq.poll() + " ");
}
IO.println("");
}Результат:
1 3 5 8Задачи по приоритету через компаратор:
record Task(String name, int priority) {}
void main() {
var pq = new PriorityQueue<>(Comparator.comparingInt(Task::priority).reversed());
pq.offer(new Task("email", 1));
pq.offer(new Task("bugfix", 5));
pq.offer(new Task("review", 3));
IO.println(pq.poll().name());
IO.println(pq.poll().name());
}Результат:
bugfix
reviewПримечания
offer() и poll() работают за логарифмическое время, peek() — мгновенно. Печать очереди или обход циклом не дают отсортированного порядка: отсортирован только порядок выдачи через poll(). По умолчанию первым выходит наименьший элемент; для наибольшего передайте Comparator.reverseOrder().
См. также
- Queue — Очередь: элементы добавляются в конец и забираются из начала.
- ArrayDeque — Быстрая двусторонняя очередь на массиве — замена `Stack` и `LinkedList`.
- Comparator.comparing() — Создаёт компаратор, который сравнивает объекты по одному полю.
- TreeSet — Множество, которое хранит элементы в отсортированном порядке.
Вопросы и ответы по теме
В учебнике
- Очереди и деки — Очереди в Java: Queue и ArrayDeque, стек на основе Deque, методы offer, poll и peek, очередь с приоритетом PriorityQueue.