Queue
Queue menggunakan kaedah first in, first out (FIFO) yang bermaksud data yang mula-mula masuk akan keluar dahulu. Sebagai contoh semasa beratur di kantin, orang yang mula-mula datang yang akan dapat beli dahulu, siapa yang lambat kena beratur di belakang.
Class yang menggunakan queue antaranya ialah LinkedList
dan
PriorityQueue
.
LinkedList
Contoh untuk membuat queue menggunakan LinkedList:
package datastructure;
import java.util.LinkedList;
import java.util.Queue;
public class ContohQueue {
public static void main(String[] args) {
Queue<String> customers = new LinkedList<>();
customers.offer("pelanggan pertama");
customers.offer("pelanggan kedua");
customers.offer("pelanggan ketiga");
System.out.println("Ambik order " + customers.poll());
System.out.println("Next!");
System.out.println("Ambik order " + customers.poll());
System.out.println("Alamak makanan sudah habis, siapa pelanggaan seterusnya?");
System.out.println(customers.peek());
System.out.println(customers.peek() + " sedang menunggu...");
}
}
Method yang digunakan adalah seperti berikut:
offer()
– untuk memasukkan data ke dalam Queuepoll()
– mengeluarkan data untuk digunakanpeek()
– mengakses data tanpa mengeluarkan data tersebut
PriorityQueue
Walaupun queue secara umumnya menggunakan kaedah FIFO, PriorityQueue agak berlainan sedikit. Data di dalam PriorityQueue ditentukan menggunakan priority (keutamaan). Data yang mempunyai keutamaan yang tinggi akan didahulukan untuk keluar (diproses).
Contoh situasi sewaktu menaiki kapal terbang. Selepas penumpang diberi kebenaran untuk masuk, pramugari pun minta warga emas yang naik dahulu, kemudian penumpang yang ada anak kecil, diikuti oleh penumpang-penumpang yang lain. Jadi, di sini warga emas mempunyai keutamaan (priority) yang lebih tinggi berbanding penumpang yang lain.
Kita akan gunakan class Penumpang untuk dimasukkan ke dalam PriorityQueue:
package datastructure;
public class Penumpang {
String jenis;
int keutamaan; // nombor besar bermaksud high priority
public Penumpang(String jenis, int keutamaan) {
this.jenis = jenis;
this.keutamaan = keutamaan;
}
}
Bagi menentukan keutamaan sesuatu class, kita boleh menggunakan class
yang menggunakan interface Comparator<E>
:
package datastructure;
import java.util.Comparator;
public class KeutamaanPenumpang implements Comparator<Penumpang> {
@Override
public int compare(Penumpang o1, Penumpang o2) {
return o2.keutamaan - o1.keutamaan;
}
}
Untuk interface Comparator
, jika method compare()
menghasilkan
nombor negatif bermaksud o1
lebih diutamakan, jika nombor positif
bermaksud o2
diutamakan, dan jika return 0
bermaksud sama
priority.
Kita mahu field keutamaan
di class Penumpang menjadi high priority
jika nombor besar dan low priority jika nombor kecil, jadi kita
tentukan priority dengan cara,
o2.keutamaan – o1.keutamaan;
Jika diterbalikkan seperti ini,
o1.keutamaan – o2.keutamaan;
bermaksud nombor kecil ialah high priority, dan nombor besar ialah low priority. Terpulang kepada anda hendak pilih yang mana.
Cara penggunaan PriorityQueue adalah seperti berikut:
package datastructure;
import java.util.PriorityQueue;
import java.util.Queue;
public class ContohQueue {
public static void main(String[] args) {
Queue<Penumpang> airport = new PriorityQueue<>(new KeutamaanPenumpang());
airport.offer(new Penumpang("lelaki dewasa bujang", 1));
airport.offer(new Penumpang("wanita bujang", 1));
airport.offer(new Penumpang("warga emas lelaki", 3));
airport.offer(new Penumpang("pasangan pengantin", 1));
airport.offer(new Penumpang("warga emas perempuan", 3));
airport.offer(new Penumpang("ada anak kecil", 2));
while (!airport.isEmpty()) {
System.out.println(airport.poll().jenis);
}
}
}
Hasilnya Penumpang yang mempunyai keutamaan yang lebih tinggi akan dikeluarkan dahulu.