English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать класс PriorityQueue из Java Collections Framework с помощью примеров.
Класс PriorityQueue предоставляет функции структуры данных堆.
Он реализуетИнтерфейс Queue.
В отличие от обычной очереди, элементы приоритетной очереди извлекаются в порядке сортировки.
Предположим, что мы хотим извлекать элементы в порядке возрастания. В этом случае, головным элементом приоритетной очереди является наименьший элемент. После извлечения этого элемента, следующий наименьший элемент становится головным элементом очереди.
需要注意的是,элементы приоритетной очереди могут не быть отсортированы. Однако элементы всегда извлекаются в порядке сортировки.
Чтобы создать приоритетную очередь,我们必须 импортировать пакет java.util.PriorityQueue. После импорта пакета, вы можете создать приоритетную очередь с помощью следующих методов в Java.
PriorityQueue<Integer> numbers = new PriorityQueue<>();
Здесь мы создали приоритетную очередь без параметров. В этом случае, головным элементом приоритетной очереди является наименьший элемент в очереди. Элементы будут удаляться из очереди в порядке возрастания.
Но мы можем использовать интерфейс Comparator, чтобы определить порядок элементов. Мы рассмотрим это в более поздней части руководства.
Класс PriorityQueue предоставляет реализацию всех методов интерфейса Queue.
add() - вставляет указанный элемент в очередь. Возвращает false, если очередь полна.
offer() - вставляет указанный элемент в очередь. Возвращает false, если очередь полна.
Например:
import java.util.PriorityQueue; class Main { public static void main(String[] args) { //Создание приоритетной очереди PriorityQueue<Integer> numbers = new PriorityQueue<>(); //Использование метода add() numbers.add(4); numbers.add(2); System.out.println("PriorityQueue: " + numbers); //Использование метода offer() numbers.offer(1); System.out.println("Обновленная PriorityQueue: " + numbers); } }
Результат вывода
PriorityQueue: [2, 4] Обновленная PriorityQueue: [1, 4, 2]
Здесь мы создали приоритетную очередь с именем numbers. Мы уже вставили 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); //Использование метода peek() int number = numbers.peek(); System.out.println("Адрес элемента: " + number); } }
Результат вывода
PriorityQueue: [1, 4, 2] Адрес элемента: 1
remove() - удаляет указанный элемент из очереди
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); //Использование метода remove() boolean result = numbers.remove(2); System.out.println("Удален ли элемент 2? " + result); //Использование метода poll() int number = numbers.poll(); System.out.println("Элемент, удаленный с помощью poll(): " + number); } }
Результат вывода
PriorityQueue: [1, 4, 2] Удален ли элемент 2? true Элемент, удаленный с помощью poll(): 1
Чтобы пройтись по элементам приоритетной очереди, мы можем использовать метод 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("Использование метода iterator() для遍ения PriorityQueue: "); // Использование метода iterator() Iterator<Integer> iterate = numbers.iterator(); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Результат вывода
Использование iterator() для遍ения PriorityQueue: 1, 4, 2,
Метод | Описание содержимого |
---|---|
contains(element) | Поиск заданного элемента в приоритетной очереди. Если элемент найден, то возвращает true,否则 false. |
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 number1, Integer number2) { int value = number1.compareTo(number2); // элементы сортируются в обратном порядке if (value > 0) { return -1; } else if (value < 0) { return 1; } else { return 0; } } }
Результат вывода
PriorityQueue: [4, 3, 1, 2]
В примере выше мы создали приоритетную очередь, передавая класс CustomComparator в качестве параметра.
Класс CustomComparator реализует интерфейс Comparator.
Затем мы перезаписываем метод compare(). Этот метод теперь делает голову элемента максимальным числом.