Queue

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

Çox adamda "növbə" sözü xoş olmayan xatirələr yaradır. Amma bu gün biz Java-dakı digər növbələrdən danışırıq. Java-da növbə, Queue interfeysini miras alan hər şey sayılır, hansı ki öz növbəsində Collection-u genişləndirir. Bu deməkdir ki, növbələrlə kolleksiyalar kimi işləyə bilərik.

Java-da növbələr iki prinsip əsasında işləyir: FIFOLIFO.

FIFO — First In First Out, adi növbənin prinsipi (əlbəttə, "sadəcə soruşmaq" istəyənlər yoxdursa), burada növbəyə ilk daxil olan element birinci çıxır.

LIFO — Last In First Out, stek prinsipi, burada növbəyə son daxil olan element birinci çıxır. Məsələn, kart dəstəsi ilə olduğu kimi: sona çatmaq üçün bütün kartları bir-bir yuxarıdan götürəcəksən.

Java-da Queue iyerarxiyası aşağıdakı kimidir:

Burada görünür ki, Queue-un 3 həyata keçirən sinfi var: LinkedList, ArrayDequePriorityQueue. LinkedListArrayDeque birbaşa Queue-dan deyil, Deque-dan miras alır.

Deque — Java 6 versiyasına əlavə edilən bir interfeysdir. Bu, növbələr üçün faydalı olan bir sıra metodları özündə cəmləşdirir və növbənin ikitərəfli növbə kimi fəaliyyət göstərməsinə imkan verir. Yəni FIFO və ya LIFO prinsipi ilə işləmək.

Deque-nin iki mirasçısından biri ArrayDeque-dir. O, növbənin ikitərəfli verilənlər strukturu olaraq dəstəkləyir, bu da elementlərin hər iki tərəfdən daxil edilməsinə və silinməsinə imkan verir. O həmçinin avtomatik olaraq ölçüsünü artırmağa bilən dinamik massivdir.

PriorityQueue adlı bir sinif də var, birbaşa Queue-nun mirasçısı: iş prinsipi Dequeue-nin mirasçılarından fərqlidir.

PriorityQueue — təbii sırala prinsipinə uyğun olaraq elementləri yerləşdirən bir prioritet növbədir. Bu sürüşdürmə üçün ComparableComparator istifadə edilir. Burada prinsip TreeSet və ya TreeMap ilə eynidir — Comparable interfeysini izləyən və öz sürüşdürmə sırası olan siniflər.


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());
}

Bu misalı konsolda çalıştırdığında, belə bir nəticə əldə edəcəksən:

Rob
John
Andrew

Çünki biz növbələrlə işləyirik, adi kolleksiyalarla deyil, siyahıdan elementi çıxarmalıyıq. Bunun üçün bu konstruksiyadan istifadə edirik:


while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.remove());
}

Deque interfeyi öz metodlarını miras alır Queue və bir sıra maraqlı metodlar əlavə edir:

void addFirst(Е obj) Elementi obj növbənin əvvəlinə əlavə edir
void addLast(Е obj) Elementi obj növbənin sonuna əlavə edir
Е getFirst() Növbənin ilk elementini qaytarır
Е getLast() Növbənin son elementini qaytarır
boolean offerFirst(Е obj) Elementi obj növbənin əvvəlinə əlavə edir, əgər element əlavə edilsə true qaytarır, əks halda false qaytarır
boolean offerLast(E obj) Elementi obj növbənin sonuna əlavə edir, əgər element əlavə edilsə true qaytarır, əks halda false qaytarır
Е рор() Növbənin ilk elementini çıxarır və onu silir
void push(Е obj) Elementi obj növbənin əvvəlinə əlavə edir
Е peekFirst() Növbənin ilk elementini qaytarır (lakin silmir)
Е peekLast() Növbənin son elementini qaytarır (lakin silmir)
Е pollFirst() Növbənin ilk elementini qaytarır və silir, əgər element yoxdursa null qaytarır
Е pollLast() Növbənin son elementini qaytarır və silir, əgər element yoxdursa null qaytarır
Е removeLast() Növbənin ilk elementini qaytarır və silir, əgər element yoxdursa istisna yaradacaq
Е removeFirst() Növbənin son elementini qaytarır və silir, əgər element yoxdursa istisna yaradacaq
boolean removeFirstOccurrence(Object obj) Növbədən obj-nin ilk rastlaşmasını silir
boolean removeLastOccurrence(Object obj) Növbədən obj-nin son rastlaşmasını silir

Gəlin indi bunlardan bir neçəsini praktika ilə görək.

Əvvəlcə növbəyə bir element əlavə edək:


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); // Növbənin sonuna "Apple" elementini əlavə edir
        deque.addFirst("Orange"); // Növbənin əvvəlinə "Orange" elementini əlavə edir
        deque.addLast("Pineapple"); // Növbənin sonuna "Pineapple" elementini əlavə edir
  
        System.out.println(deque);
    
[Orange, Apple, Pineapple]

İndi isə növbədən dəyərləri əldə edək:


	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());
                          
    }
    

Bu kod növbənin ilk və son elementini konsolda göstərəcək.

The First element is: Orange
The Last element is: Pineapple


         Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pop()); // növbənin üst elementini çıxaracaq və siləcək
System.out.println(deque.poll()); // növbənin üst elementini çıxaracaq və siləcək

System.out.println(deque);
    

Bu kodu çalışdırdıqda belə bir nəticə əldə edəcəyik:

Orange
Apple

[Pineapple, Lemon]

pop()poll() metodları arasındakı fərq ondan ibarətdir ki, pop() siyahı boş olduqda NoSuchElementException istisnası yaradacaq, amma poll() null qaytaracaq.

İndi isə pollFirst()pollLast() metodlarına baxaq.


Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); 
        deque.addFirst("Orange"); 
        deque.addLast("Pineapple"); 
        deque.add("Lemon");

System.out.println(deque.pollFirst()); // növbənin ilk elementini çıxaracaq və siləcək
System.out.println(deque.pollLast()); // növbənin son elementini çıxaracaq və siləcək.
System.out.println(deque);
    
Orange
Lemon
[Apple, PineApple]

Hər iki metod növbədən dəyər qaytarır və onu silir.

peekFirst()peekLast() metodlarının istifadəsinin nümunəsi:


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);
    
The first element is: John
The last element is: Oliver
[John, Rob, Greg, Max, Oliver]

Hər iki metod növbənin ilk/son elementini qaytarır və onları silmir. Əgər növbə boşdursa, null qaytarılacaq.

Ümumən belə, bu gün biz Java-da növbələrlə işləməyin yollarını öyrəndik. İndi onların praktiki istifadəsini necə edəcəyini biləcəksən.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION