I denne vejledning lærer vi om PriorityQueue-klassen i Java-samlingens ramme ved hjælp af eksempler.
Den PriorityQueue
klasse giver funktionalitet af den bunke datastruktur.
Det implementerer køgrænsefladen.
I modsætning til normale køer hentes prioritetskøelementer i sorteret rækkefølge.
Antag, vi vil hente elementer i stigende rækkefølge. I dette tilfælde vil hovedet på prioritetskøen være det mindste element. Når dette element er hentet, er det næste mindste element hovedet på køen.
Det er vigtigt at bemærke, at elementerne i en prioritetskø muligvis ikke sorteres. Elementer hentes dog altid i sorteret rækkefølge.
Oprettelse af PriorityQueue
For at oprette en prioritetskø skal vi importere java.util.PriorityQueue
pakken. Når vi først har importeret pakken, kan vi her oprette en prioritetskø i Java.
PriorityQueue numbers = new PriorityQueue();
Her har vi oprettet en prioritetskø uden argumenter. I dette tilfælde er hovedet på prioritetskøen det mindste element i køen. Og elementer fjernes i stigende rækkefølge fra køen.
Vi kan dog tilpasse rækkefølgen af elementer ved hjælp af Comparator
grænsefladen. Vi lærer om det senere i denne vejledning.
Metoder til PriorityQueue
Den PriorityQueue
klasse giver gennemførelsen af alle de metoder, der er til stede i Queue
grænsefladen.
Indsæt elementer i PriorityQueue
add()
- Indsætter det angivne element i køen. Hvis køen er fuld, kaster den en undtagelse.offer()
- Indsætter det angivne element i køen. Hvis køen er fuld, vender den tilbagefalse
.
For eksempel,
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); ) )
Produktion
PriorityQueue: (2, 4) Opdateret PriorityQueue: (1, 4, 2)
Her har vi oprettet en prioritetskø med numre. Vi har indsat 4 og 2 i køen.
Selvom 4 indsættes før 2, er køens hoved 2. Det skyldes, at hovedet på prioritetskøen er det mindste element i køen.
Vi har derefter indsat 1 i køen. Køen er nu arrangeret for at gemme det mindste element 1 til køens hoved.
Få adgang til PriorityQueue-elementer
For at få adgang til elementer fra en prioritetskø kan vi bruge peek()
metoden. Denne metode returnerer køens hoved. For eksempel,
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); ) )
Produktion
PriorityQueue: (1, 4, 2) Accessed Element: 1
Fjern PriorityQueue Elements
remove()
- fjerner det angivne element fra køenpoll()
- vender tilbage og fjerner køens hoved
For eksempel,
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); ) )
Produktion
PriorityQueue: (1, 4, 2) Er elementet 2 fjernet? sandt fjernet element ved hjælp af afstemning (): 1
Iterering over en prioritetskue
For at gentage elementerne i en prioritetskø kan vi bruge iterator()
metoden. For at kunne bruge denne metode skal vi importere java.util.Iterator
pakken. For eksempel,
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(", "); ) ) )
Produktion
PriorityQueue ved hjælp af iterator (): 1, 4, 2,
Andre PriorityQueue-metoder
Metoder | Beskrivelser |
---|---|
contains(element) | Søger i prioritetskøen efter det angivne element. Hvis elementet findes, returnerer det true , hvis ikke det returnerer false . |
size() | Returnerer længden af prioritetskøen. |
toArray() | Konverterer en prioritetskø til en matrix og returnerer den. |
PriorityQueue-komparator
I alle eksemplerne ovenfor hentes elementerne i den prioriterede kø i den naturlige rækkefølge (stigende rækkefølge). Vi kan dog tilpasse denne bestilling.
Til dette er vi nødt til at oprette vores egen komparatorklasse, der implementerer Comparator
grænsefladen. For eksempel,
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; ) ) )
Produktion
PriorityQueue: (4, 3, 1, 2)
I ovenstående eksempel har vi oprettet en prioritetskø, der passerer CustomComparator-klassen som et argument.
CustomComparator-klassen implementerer Comparator
grænsefladen.
Vi tilsidesætter derefter compare()
metoden. Metoden får nu elementets hoved til at være det største tal.
Hvis du vil lære mere om komparatoren, skal du besøge Java Comparator.