Bagi kebanyakan orang, perkataan "baris gilir" mengingatkan sangat sedikit persatuan yang menyenangkan. Tetapi hari ini kita bercakap tentang baris gilir yang berbeza — baris gilir Java. Di Java, baris gilir ialah apa sahaja yang mewarisi antara muka Queue , yang seterusnya memanjangkan antara muka Koleksi . Ini bermakna baris gilir boleh dianggap seperti koleksi.

Baris gilir dalam Java menyokong dua prinsip operasi: FIFO dan LIFO .

Prinsip FIFO (Masuk Pertama, Keluar Dahulu) mengawal baris gilir biasa — elemen pertama yang ditambahkan pada baris gilir ialah yang pertama meninggalkannya.

Prinsip LIFO (Masuk Terakhir, Keluar Dahulu) menerangkan tingkah laku tindanan — elemen terakhir yang ditambahkan pada baris gilir ialah yang pertama meninggalkannya. Sebagai contoh, ini adalah cara anda bekerja dengan dek kad: anda mengeluarkan kad dari bahagian atas satu demi satu sehingga anda mencapai bahagian bawah dek.

Hierarki Queue di Java kelihatan seperti ini:

Di sini anda boleh melihat bahawa Queue mempunyai 3 kelas pelaksanaan: LinkedList , ArrayDeque dan PriorityQueue . LinkedList dan ArrayDeque secara langsung tidak mewarisi Queue , tetapi Deque .

Deque ialah antara muka yang telah ditambah dalam Java 6. Ia termasuk beberapa kaedah yang berguna untuk baris gilir dan membolehkan baris gilir berfungsi sebagai baris gilir dua hujung (atau dua arah). Maksudnya boleh jadiFIFOdanLIFO.

Salah satu daripada dua keturunan antara muka Deque ialah ArrayDeque . Ia menyokong baris gilir dua kali ganda yang membolehkan anda memasukkan dan mengalih keluar elemen dari kedua-dua hujung. Ia juga merupakan tatasusunan dinamik yang secara automatik membesar dalam saiz.

Terdapat juga kelas PriorityQueue , yang merupakan keturunan langsung Queue : ia berkelakuan berbeza daripada kelas yang melaksanakan Deque .

PriorityQueue ialah baris gilir keutamaan yang menyusun elemen mengikut susunan semula jadinya secara lalai. Di sini pengisihan menggunakan antara muka Sebanding dan Pembanding . Prinsipnya adalah sama seperti dengan TreeSet atau TreeMap — kelas yang menggunakan antara muka Sebanding dan mempunyai susunan isihan mereka sendiri.

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

Jika anda menjalankan contoh ini, berikut ialah perkara yang anda akan lihat dalam konsol:

Rob
John
Andrew

Memandangkan kami bekerja dengan baris gilir dan bukan koleksi biasa, kami perlu mengalih keluar elemen daripada senarai. Untuk melakukan ini, kami menggunakan binaan ini:

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

Antara muka Deque mewarisi kaedah Queue dan menambah beberapa kaedah menariknya sendiri:

batal addFirst(E obj) Menambah elemen obj ke hadapan baris gilir
batal addLast(E obj) Menambah elemen obj pada penghujung baris gilir
E getFirst() Mengembalikan elemen pertama daripada baris gilir
E getLast() Mengembalikan elemen terakhir dari baris gilir
tawaran booleanFirst(E obj) Menambah elemen obj ke hadapan baris gilir dan mengembalikan benar jika elemen itu ditambahkan. Jika tidak, mengembalikan false .
tawaran booleanTerakhir(E obj) Menambah elemen obj pada penghujung baris gilir, dan mengembalikan benar jika elemen itu ditambahkan. Jika tidak, mengembalikan false .
E pop() Mendapat elemen pertama daripada baris gilir dan mengalih keluarnya
tolak batal(E obj) Menambah elemen obj ke hadapan baris gilir
E peekFirst() Mengembalikan (tetapi tidak mengalih keluar) elemen pertama daripada baris gilir
E peekLast() Mengembalikan (tetapi tidak mengalih keluar) elemen terakhir daripada baris gilir
E pollFirst() Mengembalikan dan mengalih keluar elemen pertama daripada baris gilir. Mengembalikan null jika tiada unsur.
E pollLast() Mengembalikan dan mengalih keluar elemen terakhir daripada baris gilir. Mengembalikan null jika tiada unsur.
E removeLast() Mengembalikan dan mengalih keluar elemen pertama baris gilir. Membuang pengecualian jika tiada unsur.
E removeFirst() Mengembalikan dan mengalih keluar elemen terakhir baris gilir. Membuang pengecualian jika tiada unsur.
boolean removeFirstOccurrence(Object obj) Mengalih keluar kejadian pertama obj daripada baris gilir
boolean removeLastOccurrence(Object obj) Mengalih keluar kejadian terakhir obj daripada baris gilir

Sekarang mari kita lihat beberapa kaedah ini dalam amalan.

Mula-mula, mari tambah elemen pada baris gilir:

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);
[Oren, Epal, Nanas]

Sekarang mari kita dapatkan nilai daripada baris gilir:

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

    }

Kod ini memaparkan elemen pertama dan terakhir baris gilir.

Unsur pertama ialah: Jingga
Unsur terakhir ialah: Nanas

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

Menjalankan kod ini, kami mendapat:


Epal Oren

[Nenas, Lemon]

Perbezaan antara pop() dan poll() ialah pop() akan membuang NoSuchElementException jika senarai adalah senarai kosong, tetapi poll() akan mengembalikan null .

Sekarang kita akan mempertimbangkan kaedah pollFirst() dan 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);
Oren
Lemon
[Epal, Nanas]

Kedua-dua kaedah mengembalikan dan mengeluarkan nilai daripada baris gilir.

Berikut ialah contoh menggunakan kaedah peekFirst() dan 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);
Elemen pertama ialah: John
Elemen terakhir ialah: Oliver
[John, Rob, Greg, Max, Oliver]

Kedua-dua kaedah mengembalikan elemen pertama/terakhir dari baris gilir dan jangan keluarkannya. Jika baris gilir kosong, null akan dikembalikan.

Bagus! Hari ini kami belajar cara bekerja dengan baris gilir di Jawa. Sekarang anda tahu cara menggunakannya dalam amalan.