A legtöbb ember számára a „sor” szó nagyon kevés kellemes asszociációt hoz eszünkbe. De ma különböző sorokról beszélünk – Java sorokról. A Java nyelven a sor minden olyan dolog, amely örökli a Queue felületet, ami viszont kiterjeszti a Gyűjtemény felületet. Ez azt jelenti, hogy a várólisták gyűjteményként kezelhetők.
A Java várólisták két működési elvet támogatnak: FIFO és LIFO .
A FIFO (First In, First Out) elv szabályozza a normál sort – a sorhoz elsőként hozzáadott elem az első, amelyik elhagyja azt.
A LIFO (Last In, First Out) elv a verem viselkedését írja le – a sorba utoljára hozzáadott elem elsőként hagyja el azt. Például így dolgozol egy pakli kártyalappal: egyenként veszed le a kártyákat a tetejéről, amíg el nem éred a pakli alját.
A Java sor hierarchiája így néz ki:
Itt látható, hogy a Queue-nak 3 megvalósítási osztálya van: LinkedList , ArrayDeque és PriorityQueue . A LinkedList és az ArrayDeque közvetlenül nem a Queue-t , hanem a Deque-t örökli .
A Deque egy interfész, amelyet a Java 6-ban adtak hozzá. Számos olyan metódust tartalmaz, amelyek hasznosak a várólistákhoz, és lehetővé teszi, hogy a sor kétvégű (vagy kétirányú) várólistaként működjön. Ez azt jelenti, hogy lehetFIFOésLIFO.
A Deque interfész két leszármazottja közül az ArrayDeque . Támogatja a kétvégű várólista, amely lehetővé teszi elemek beillesztését és eltávolítását mindkét végéről. Ez egy dinamikus tömb is, amelynek mérete automatikusan nő.
Van egy PriorityQueue osztály is, amely a Queue közvetlen leszármazottja : másképp viselkedik, mint a Deque -t megvalósító osztályok .
A PriorityQueue egy prioritási sor, amely alapértelmezés szerint a természetes sorrendjük szerint rendezi az elemeket. Itt a rendezés a Comparable és Comparator felületeket használja. Az elv ugyanaz, mint a TreeSet vagy TreeMap esetében – olyan osztályok, amelyek a Comparable felületet használják, és saját rendezési sorrendjük van.
PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));
priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
Ha ezt a példát futtatja, a következőket fogja látni a konzolon:
John
Andrew
Mivel sorokkal dolgozunk, és nem szokványos gyűjteményekkel, ezért el kell távolítanunk az elemeket a listából. Ehhez ezt a konstrukciót használjuk:
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
A Deque interfész örökli a Queue metódusokat, és számos érdekes módszert ad hozzá:
void addFirst(E obj) | Hozzáadja az obj elemet a sor elejéhez |
void addLast(E obj) | Hozzáadja az obj elemet a sor végéhez |
E getFirst() | Visszaadja a sor első elemét |
E getLast() | A sor utolsó elemét adja vissza |
logikai ajánlatFirst(E obj) | Hozzáadja az obj elemet a sor elejéhez, és igaz értéket ad vissza , ha az elemet hozzáadja. Ellenkező esetben false értéket ad vissza . |
logikai ajánlatLast(E obj) | Hozzáadja az obj elemet a sor végéhez, és igaz értéket ad vissza , ha az elemet hozzáadja. Ellenkező esetben false értéket ad vissza . |
E pop() | Lekéri az első elemet a sorból, és eltávolítja |
void push (E obj) | Hozzáadja az obj elemet a sor elejéhez |
E peekFirst() | Visszaadja (de nem távolítja el) a sor első elemét |
E peekLast() | Visszaadja (de nem távolítja el) a sor utolsó elemét |
E pollFirst() | Visszaadja és eltávolítja a sor első elemét. Null értékkel tér vissza , ha nincsenek elemek. |
E pollLast() | Visszaadja és eltávolítja a sor utolsó elemét. Null értékkel tér vissza , ha nincsenek elemek. |
E RemoveLast() | Visszaadja és eltávolítja a sor első elemét. Kivételt dob, ha nincsenek elemek. |
E RemoveFirst() | Visszaadja és eltávolítja a sor utolsó elemét. Kivételt dob, ha nincsenek elemek. |
logikai értékű RemoveFirstCurrence(Object Obj) | Eltávolítja az obj első előfordulását a sorból |
Boolean RemoveLastOccurrence(Object Obj) | Eltávolítja az obj utolsó előfordulását a sorból |
Most nézzünk meg néhány ilyen módszert a gyakorlatban.
Először adjunk hozzá egy elemet a sorhoz:
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple"); // Adds "Apple" to the end of the queue
deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue
System.out.println(deque);
Most vegyünk ki értékeket egy sorból:
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
System.out.println("The first element is: "+ deque.getFirst());
System.out.println("The last element is: " + deque.getLast());
}
Ez a kód a sor első és utolsó elemét jeleníti meg.
Az utolsó elem: Ananász
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
deque.add("Lemon");
System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue
System.out.println(deque);
Ezt a kódot futtatva a következőket kapjuk:
alma
[ananász, citrom]
A pop() és poll() közötti különbség az, hogy a pop() NoSuchElementException kivételt fog dobni , ha a lista üres, de a poll() null értéket ad vissza .
Most megvizsgáljuk a pollFirst() és pollLast() metódusokat.
Deque<String> deque = new ArrayDeque<>();
deque.add("Apple");
deque.addFirst("Orange");
deque.addLast("Pineapple");
deque.add("Lemon");
System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
citrom
[alma, fenyőalma]
Mindkét módszer értéket ad vissza és eltávolít a sorból.
Íme egy példa a peekFirst() és peekLast() metódusok használatára:
Deque<String> friends = new ArrayDeque<>();
friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");
System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());
System.out.println(friends);
Az utolsó elem: Oliver
[John, Rob, Greg, Max, Oliver]
Mindkét módszer visszaadja az első/utolsó elemet a sorból, és nem távolítja el őket. Ha a sor üres, nullát ad vissza a rendszer.
Szép munka! Ma megtanultuk, hogyan kell dolgozni várólistákkal Java nyelven. Most már tudja, hogyan kell használni őket a gyakorlatban.
GO TO FULL VERSION