Ç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: FIFO və LIFO.
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, ArrayDeque və PriorityQueue. LinkedList və ArrayDeque 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 Comparable və Comparator 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:
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);
İ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 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:
Apple
[Pineapple, Lemon]
pop() və poll() metodları arasındakı fərq ondan ibarətdir ki, pop() siyahı boş olduqda NoSuchElementException istisnası yaradacaq, amma poll() null qaytaracaq.
İndi isə pollFirst() və 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);
Lemon
[Apple, PineApple]
Hər iki metod növbədən dəyər qaytarır və onu silir.
peekFirst() və 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 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.
GO TO FULL VERSION