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:

Rob
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);
[Narancs, alma, ananász]

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 első elem: Narancs
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:

Narancs
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);
Narancssárga
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 első elem: John
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.