В този урок ще научим за класа 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 в главата на опашката.
Достъп до елементи на приоритетната опашка
За достъп до елементи от опашка с приоритет можем да използваме 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 Премахнат елемент с помощта на анкета (): 1
Итериране над приоритетна опашка
За да прегледаме елементите на приоритетна опашка, можем да използваме 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 с използване на итератор (): 1, 4, 2,
Други методи на приоритетната опашка
Методи | Описания |
---|---|
contains(element) | Търси опашката с приоритет за посочения елемент. Ако елементът бъде намерен, той се връща true , ако не се връща false . |
size() | Връща дължината на опашката с приоритет. |
toArray() | Преобразува приоритетна опашка в масив и го връща. |
PriorityQueue Comparator
Във всички примери по-горе елементите на опашката с приоритет се извличат в естествения ред (възходящ ред). Въпреки това можем да персонализираме тази поръчка.
За това трябва да създадем собствен клас за сравнение, който реализира 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.