В этом руководстве мы узнаем о классе PriorityQueue инфраструктуры коллекций Java с помощью примеров.
PriorityQueue
Класс обеспечивает функциональность кучи структуры данных.
Он реализует интерфейс очереди.
В отличие от обычных очередей, приоритетные элементы очереди извлекаются в отсортированном порядке.
Предположим, мы хотим получать элементы в порядке возрастания. В этом случае заголовок очереди с приоритетом будет наименьшим элементом. После получения этого элемента следующий наименьший элемент будет заголовком очереди.
Важно отметить, что элементы приоритетной очереди не могут быть отсортированы. Однако элементы всегда извлекаются в отсортированном порядке.
Создание PriorityQueue
Чтобы создать приоритетную очередь, мы должны импортировать java.util.PriorityQueue
пакет. После импорта пакета вот как мы можем создать приоритетную очередь в Java.
PriorityQueue numbers = new PriorityQueue();
Здесь мы создали приоритетную очередь без аргументов. В этом случае заголовок очереди с приоритетом является наименьшим элементом очереди. И элементы удаляются из очереди в порядке возрастания.
Однако мы можем настроить порядок элементов с помощью Comparator
интерфейса. Мы узнаем об этом позже в этом руководстве.
Методы PriorityQueue
PriorityQueue
Класс обеспечивает реализацию всех методов , присутствующих в Queue
интерфейсе.
Вставить элементы в PriorityQueue
add()
- Вставляет указанный элемент в очередь. Если очередь заполнена, генерируется исключение.offer()
- Вставляет указанный элемент в очередь. Если очередь заполнена, возвращаетсяfalse
.
Например,
import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); // Using the add() method numbers.add(4); numbers.add(2); System.out.println("PriorityQueue: " + numbers); // Using the offer() method numbers.offer(1); System.out.println("Updated PriorityQueue: " + numbers); ) )
Вывод
PriorityQueue: (2, 4) Обновленный PriorityQueue: (1, 4, 2)
Здесь мы создали приоритетную очередь с именами номеров. Мы добавили в очередь 4 и 2.
Хотя 4 вставляется перед 2, заголовок очереди равен 2. Это потому, что заголовок очереди с приоритетом является наименьшим элементом очереди.
Затем мы добавили 1 в очередь. Очередь теперь перестроена, чтобы сохранить наименьший элемент 1 в заголовке очереди.
Доступ к элементам PriorityQueue
Чтобы получить доступ к элементам из приоритетной очереди, мы можем использовать peek()
метод. Этот метод возвращает заголовок очереди. Например,
import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the peek() method int number = numbers.peek(); System.out.println("Accessed Element: " + number); ) )
Вывод
PriorityQueue: (1, 4, 2) Доступный элемент: 1
Удалить элементы PriorityQueue
remove()
- удаляет указанный элемент из очередиpoll()
- возвращает и убирает голову очереди
Например,
import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the remove() method boolean result = numbers.remove(2); System.out.println("Is the element 2 removed? " + result); // Using the poll() method int number = numbers.poll(); System.out.println("Removed Element Using poll(): " + number); ) )
Вывод
PriorityQueue: (1, 4, 2) Элемент 2 удален? true Удаленный элемент с помощью poll (): 1
Итерация PriorityQueue
Чтобы перебрать элементы очереди с приоритетом, мы можем использовать iterator()
метод. Чтобы использовать этот метод, мы должны импортировать java.util.Iterator
пакет. Например,
import java.util.PriorityQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.print("PriorityQueue using iterator(): "); //Using the iterator() method Iterator iterate = numbers.iterator(); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) )
Вывод
PriorityQueue с использованием iterator (): 1, 4, 2,
Другие методы PriorityQueue
Методы | Описания |
---|---|
contains(element) | Ищет указанный элемент в очереди с приоритетом. Если элемент найден, он возвращается true , если нет - возвращается false . |
size() | Возвращает длину очереди с приоритетом. |
toArray() | Преобразует приоритетную очередь в массив и возвращает его. |
Компаратор PriorityQueue
Во всех приведенных выше примерах элементы очереди с приоритетом извлекаются в естественном порядке (в порядке возрастания). Однако мы можем настроить этот порядок.
Для этого нам нужно создать собственный класс компаратора, реализующий Comparator
интерфейс. Например,
import java.util.PriorityQueue; import java.util.Comparator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue 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 ( @Override public int compare(Integer number1, Integer number2) ( int value = number1.compareTo(number2); // elements are sorted in reverse order if (value> 0) ( return -1; ) else if (value < 0) ( return 1; ) else ( return 0; ) ) )
Вывод
PriorityQueue: (4, 3, 1, 2)
В приведенном выше примере мы создали приоритетную очередь, передав класс CustomComparator в качестве аргумента.
Класс CustomComparator реализует Comparator
интерфейс.
Затем мы переопределяем compare()
метод. Теперь метод заставляет заголовок элемента быть наибольшим числом.
Чтобы узнать больше о компараторе, посетите Java Comparator.