Java PriorityQueue: основы, операции и пользовательская сортировка
Java PriorityQueue
Изучите класс PriorityQueue в Java Collections Framework через чёткие примеры и лучшие практики.
Класс PriorityQueue реализует структуру данных кучу и удовлетворяет интерфейсу Queue, предлагая эффективное извлечение элементов на основе приоритета, а не порядка вставки.
Создание PriorityQueue
Начните с импорта java.util.PriorityQueue:
import java.util.PriorityQueue;
PriorityQueue<Integer> numbers = new PriorityQueue<>();
Эта конфигурация по умолчанию использует естественный порядок (по возрастанию). Порядок можно настроить, передав Comparator при создании очереди.
Ключевые методы PriorityQueue
Доступны все методы, определённые в интерфейсе Queue, плюс несколько специфичных для очереди операций.
Вставка элементов
add()— добавляет элемент; выбрасывает исключение, если очередь полна.offer()— добавляет элемент; возвращаетfalse, если очередь полна.
Пример:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
System.out.println("PriorityQueue: " + numbers);
numbers.offer(1);
System.out.println("Updated PriorityQueue: " + numbers);
}
}
Вывод
PriorityQueue: [2, 4] Updated PriorityQueue: [1, 4, 2]
Хотя 4 был добавлен до 2, голова остаётся 2, так как это наименьший элемент. Добавление 1 переупорядочивает очередь, делая 1 головой.
Доступ к элементам
Используйте peek() для просмотра головы без удаления:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
int number = numbers.peek();
System.out.println("Accessed Element: " + number);
}
}
Вывод
PriorityQueue: [1, 4, 2] Accessed Element: 1
Удаление элементов
remove()— удаляет указанный элемент, возвращаяtrueпри успехе.poll()— извлекает и удаляет голову очереди.
Пример:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
boolean result = numbers.remove(2);
System.out.println("Is the element 2 removed? " + result);
int number = numbers.poll();
System.out.println("Removed Element Using poll(): " + number);
}
}
Вывод
PriorityQueue: [1, 4, 2] Is the element 2 removed? true Removed Element Using poll(): 1
Итерация по PriorityQueue
Итерируйте с помощью iterator() (требует java.util.Iterator):
import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.print("PriorityQueue using iterator(): ");
Iterator<Integer> iterate = numbers.iterator();
while (iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Вывод
PriorityQueue using iterator(): 1, 4, 2,
Дополнительные методы
| Метод | Описание |
|---|---|
contains(element) | Возвращает true, если элемент существует в очереди. |
size() | Возвращает количество элементов в очереди. |
toArray() | Преобразует очередь в массив. |
Пользовательская сортировка с Comparator
Для обратного естественного порядка или любой пользовательской логики приоритета передайте Comparator при создании очереди:
import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
numbers.add(4);
numbers.add(2);
numbers.add(1);
numbers.add(3);
System.out.print("PriorityQueue: " + numbers);
}
}
class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b.compareTo(a); // обратный порядок
}
}
Вывод
PriorityQueue: [4, 3, 1, 2]
Пользовательский компаратор гарантирует, что голова — наибольший элемент. Для более глубокого понимания обратитесь к Java Comparator API.
java
- Освоение операторов Java: типы, синтаксис и практические примеры
- Комментарии в Java: типы, использование и лучшие практики
- Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
- Освоение строк в Java: создание, методы и лучшие практики
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Try-with-resources в Java: автоматическое управление ресурсами
- Аннотации в Java: типы, размещение и практические примеры
- Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
- Понимание Java Vector: использование, особенности и сравнение с ArrayList