Kolejki

Kolejki są to klasy implementujące interfejs java.util.Queue<E>. Kolejki dodano do standardowej biblioteki Javy dopiero w wersji 1.5 co oznacza, że jeśli będziemy mieli do czynienia z Javą w wersjach niższych, to kolejek nie będziemy mogli używać (bo ich tam po prostu nie ma).

Najpopularniejszymi implementacjami kolejek są klasy: java.util.PriorityQueue<E> oraz java.util.LinkedList<E>. Klasa LinkedList jest już nam znana z lektury artykułu „Listy”. Klasa ta implementuje zarówno interfejs Queue jak i List, tzn. jest zarówno kolejką jak i listą. Typowa deklaracja kolejki elementów typu String wygląda tak:

Queue<String> myQueue = new PriorityQueue<String>();

albo tak:

Queue<String> myQueue = new LinkedList<String>();

Typowe operacje używane do pracy z kolejkami to: dodawanie elementów oraz pobieranie elementów w kolejności ustawienia w kolejce.

Elementy do kolejki dodajemy wywołując operację offer(E o). Metoda ta zwraca wynik typu boolean informujący o statusie operacji. Może zdarzyć się, że kolejka nakłada pewne ograniczenia, np. na maksymalną liczbę elementów, a więc dodanie nie zawsze musi się powieść (np. jeśli miałby zostać przekroczony dopuszczalny rozmiar kolejki). Wartość true oznacza, że element został dodany a false, że z jakichś względów nie było to możliwe. Aby dodać element „Ola” do kolejki utworzonej w poprzednim przykładzie napiszemy:

myQueue.offer("Ola");

Operacja poll() służy do pobrania elementu z kolejki. Jeśli kolejka jest pusta to operacja zwraca wartość null. Pobierany element jest z kolejki usuwany. Jeśli chcemy pobrać element bez usuwania go z kolejki, tj. element ten chcemy tylko podejrzeć, to używamy operacji peek(). Zupełnie tak samo jak operacja pool() zwraca ona pobierany element lub null jeśli kolejka była pusta. Aby pobrać pierwszy element z kolejki myQueue elementów typu String napiszemy:

String str = myQueue.pool();

albo, jeśli nie chcemy elementu z kolejki usuwać:

String str = myQueue.peek();

To jaka jest kolejność uporządkowania elementów w kolejce zależy od wybranej implementacji. Klasa LinkedList implementuje kolejkę FIFO (ang. First In First Out), tj. elementy są ustawione w takiej kolejności w jakiej zostały do kolejki dodane. Jeśli wpierw dodaliśmy (za pomocą operacji offer(…)) element „Ola” a potem „Ala” to pierwsze wywołanie operacji pool() zwróci obiekt „Ola” a drugie „Ala”. Klasa PriorityQueue implementuje kolejkę priorytetową, tj. operacja pool() (i peek()) zawsze zwraca element o najwyższym priorytecie, tj. najmniejszy. Przykładowo, jeśli dodaliśmy do naszej kolejki obiekty „Ola” i „Ala” to niezależnie od kolejności dodawania pierwsze wywołanie operacji pool() zwróci obiekt „Ala” a drugie „Ola”. Zaimplementujmy w ramach ćwiczenia program, który przetestuje czy to co napisałem powyżej jest prawdą.

0 0 votes
Daj ocenę