Dla wielu osób słowo „kolejka” budzi bardzo mało przyjemnych skojarzeń. Ale dzisiaj mówimy o innych kolejkach - w Javie. Kolejka w Javie to wszystko, co dziedziczy interfejs kolejki , który z kolei rozszerza kolekcję . Oznacza to, że kolejki można traktować jak kolekcje.
Kolejki w Javie działają na dwóch zasadach: FIFO i LIFO .
FIFO – First In First Out, zasada normalnej kolejki (oczywiście jeśli nie ma takich, którzy muszą „po prostu zapytać”), w której pierwszy element wchodzi do kolejki i jako pierwszy z niej wychodzi.
LIFO - Last In First Out, zasada stosu, w której ostatni element dodany do kolejki jako pierwszy ją opuści. Na przykład, jak z talią kart: będziesz brał wszystkie karty z wierzchu na raz, aby dotrzeć do końca.
Hierarchia kolejek w Javie wygląda następująco:
Tutaj możesz zobaczyć, że Queue ma 3 klasy implementacji: LinkedList , ArrayDeque i PriorityQueue . LinkedList i ArrayDeque dziedziczą bezpośrednio nie z Queue , ale z Deque .
Deque to interfejs dodany w wersji 6 Javy. Zawiera szereg przydatnych metod dla kolejek i umożliwia działanie kolejki jako kolejki dwukierunkowej. Czyli praca na zasadzieFIFOlubLIFO.
Jednym z dwóch potomków Deque jest ArrayDeque . Obsługuje dwukierunkową strukturę danych kolejki, umożliwiając wstawianie i usuwanie elementów z obu stron. Jest to również tablica dynamiczna, której rozmiar może automatycznie rosnąć.
Istnieje również klasa PriorityQueue , która jest bezpośrednim potomkiem Queue : działa inaczej niż potomkowie Dequeue .
PriorityQueue to kolejka priorytetowa, która domyślnie układa elementy zgodnie z naturalnym porządkiem sortowania. Do sortowania używane są tu Porównywalne i Porównywalne . Zasada jest tutaj taka sama jak w przypadku TreeSet lub TreeMap — klasy, które są zgodne z interfejsem Comparable i mają własny porządek sortowania.
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());
}
Uruchomienie tego przykładu w konsoli da ci:
Jan
Andrzej
Ponieważ pracujemy z kolejkami, a nie zwykłymi kolekcjami, musimy usunąć element z listy. Użyjmy tej konstrukcji:
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
Interfejs Deque dziedziczy metody Queue i dodaje kilka własnych, interesujących metod:
void addFirst(E obj) | Dodaje element obj na początek kolejki |
void addLast(E obj) | Dodaje element obj na koniec kolejki |
E getFirst() | Zwraca pierwszy element z kolejki |
E getLast() | Zwraca ostatni element z kolejki |
boolean OfferFirst(E obj) | Dodaje element obj na początek kolejki i zwraca wartość true , jeśli element został dodany, w przeciwnym razie zwraca wartość false |
boolean OfferLast(E obj) | Dodaje element obj na koniec kolejki i zwraca wartość true , jeśli element został dodany, w przeciwnym razie zwraca wartość false |
E pop() | Wyciąga pierwszy element z kolejki i usuwa go |
void push(E obiekt) | Dodaje element obj na początek kolejki |
Najpierw zerknij() | Zwraca (ale nie usuwa) pierwszy element z kolejki |
E peekLast() | Zwraca (ale nie usuwa) ostatni element z kolejki |
Pierwsza ankieta() | Zwraca i usuwa pierwszy element z kolejki, zwróci null , jeśli nie ma żadnych elementów |
E ankietaOstatnia() | Zwraca i usuwa ostatni element z kolejki, zwróci null , jeśli nie ma żadnych elementów |
E usuńOstatni() | Zwraca i usuwa pierwszy element kolejki, zgłasza wyjątek w przypadku braku elementów |
E usuńPierwszy() | Zwraca i usuwa ostatni element kolejki, zgłasza wyjątek w przypadku braku elementów |
boolean removeFirstOccurrence(obiekt obiektu) | Usuwa pierwsze wystąpienie obj z kolejki |
boolean removeLastOccurrence(obiekt obiektu) | Usuwa ostatnie wystąpienie obj z kolejki |
Przyjrzyjmy się teraz kilku z nich w praktyce.
Najpierw dodajmy element do kolejki:
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);
Teraz otrzymujemy wartości z kolejki:
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());
}
Ten kod wyświetli pierwszy i ostatni element kolejki w konsoli.
Ostatni element to: Ananas
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);
Uruchamiając ten kod, otrzymujemy:
Jabłko
[Ananas, Cytryna]
Różnica między metodami pop() i poll() polega na tym, że pop() zgłosi wyjątek NoSuchElementException na pustej liście, podczas gdy poll() zwróci wartość null .
Przyjrzyjmy się teraz metodom pollFirst() i pollLast() .
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);
Cytryna Pomarańczowa
[Jabłko, Ananas]
Obie metody zwracają i usuwają wartość z kolejki.
Przykład użycia metod peekFirst() i peekLast() :
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);
Ostatni element to: Oliver
[John, Rob, Greg, Max, Oliver]
Obie metody zwracają pierwszy/ostatni element z kolejki i nie usuwają ich. W przypadku, gdy kolejka jest pusta, zwrócona zostanie wartość null .
Ogólnie coś w tym stylu, dzisiaj nauczyliśmy się pracować z kolejkami w Javie. Teraz będziesz wiedział, jak je wykorzystać w praktyce.
GO TO FULL VERSION