Lớp PriorityQueue trong Java: Hướng Dẫn Cho Người Mới Bắt Đầu

Giới Thiệu

Xin chào, các nhà lập trình Java tương lai! Hôm nay, chúng ta sẽ bơi lội vào thế giới kỳ diệu của PriorityQueue trong Java. Đừng lo lắng nếu bạn chưa từng nghe về nó trước đây - chúng ta sẽ bắt đầu từ đầu và học cùng nhau. Hãy tưởng tượng PriorityQueue như một loại hàng (hoặc queue) đặc biệt nơi người quan trọng nhất (hoặc mục) luôn được đặt ưu tiên. Thú vị phải không? Hãy bắt đầu nào!

Java - PriorityQueue

Khai Báo Lớp

Trong Java, lớp PriorityQueue là một phần của Khung công tác Java Collections. Nó như một danh sách VIP cho dữ liệu của bạn! Dưới đây là cách bạn khai báo nó:

import java.util.PriorityQueue;

PriorityQueue<ElementType> pq = new PriorityQueue<>();

Thay thế ElementType bằng loại dữ liệu bạn muốn lưu trữ, như Integer, String hoặc thậm chí là các đối tượng tùy chỉnh của riêng bạn (nhưng chúng ta sẽ đến phần này sau).

Tham Số

Khi tạo một PriorityQueue, bạn có thể xác định một số tham số tùy chọn:

  1. Khả năng chứa ban đầu: Số lượng mục có thể chứa ban đầu.
  2. So sánh: Một đối tượng đặc biệt quyết định thứ tự của các yếu tố.

Dưới đây là một ví dụ:

PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());

Điều này tạo ra một PriorityQueue có khả năng chứa 10 số nguyên ban đầu, và chúng sẽ được sắp xếp từ cao đến thấp.

Các Hàm Khởi Tạo

PriorityQueue đi kèm với một số hàm khởi tạo. Hãy tưởng tượng các hàm khởi tạo như các công thức khác nhau để tạo queue của bạn. Dưới đây là những hàm chính:

Hàm Khởi Tạo Mô Tả
PriorityQueue() Tạo một hàng chờ trống với khả năng chứa ban đầu mặc định (11)
PriorityQueue(int initialCapacity) Tạo một hàng chờ trống với khả năng chứa cụ thể
PriorityQueue(Comparator<? super E> comparator) Tạo một hàng chờ trống với so sánh cụ thể
PriorityQueue(Collection<? extends E> c) Tạo một hàng chờ chứa các yếu tố trong tập hợp cụ thể

Hãy xem một ví dụ:

PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);

Trong dòng đầu tiên, chúng ta đang tạo một hàng chờ cho các chuỗi (có thể là tên trái cây?). Trong dòng thứ hai, chúng ta đang tạo một hàng chờ cho các số có khả năng chứa 20 mục ban đầu.

Các Phương Thức của Lớp

Bây giờ, hãy xem một số điều thú vị mà bạn có thể làm với một PriorityQueue:

Phương Thức Mô Tả
add(E e) Thêm một yếu tố vào hàng chờ
offer(E e) Thêm một yếu tố vào hàng chờ (trả về false nếu đầy)
peek() Lấy, nhưng không xóa, phần đầu của hàng chờ
poll() Lấy và xóa phần đầu của hàng chờ
remove(Object o) Xóa một thể hiện cụ thể của yếu tố đã chỉ định
size() Trả về số lượng yếu tố trong hàng chờ
clear() Xóa tất cả các yếu tố khỏi hàng chờ

Hãy xem những điều này trong hành động:

PriorityQueue<String> animalQueue = new PriorityQueue<>();

animalQueue.add("Chó");
animalQueue.offer("Mèo");
animalQueue.add("Khỉ");

System.out.println("Peek: " + animalQueue.peek()); // In ra: Peek: Mèo
System.out.println("Poll: " + animalQueue.poll()); // In ra: Poll: Mèo
System.out.println("Size: " + animalQueue.size()); // In ra: Size: 2

Có thấy "Mèo" xuất hiện trước không? Đó là vì PriorityQueue sắp xếp chuỗi theo bảng chữ cái mặc định.

Các Phương Thức Kế Thừa

PriorityQueue cũng kế thừa các phương thức từ các lớp cha của nó. Như nhận được các tính năng bổ sung! Một số phương thức hữu ích bao gồm:

  • contains(Object o): Kiểm tra xem hàng chờ có chứa yếu tố cụ thể hay không
  • toArray(): Trả về một mảng chứa tất cả các yếu tố trong hàng chờ
  • iterator(): Trả về một con trỏ qua các yếu tố trong hàng chờ

Dưới đây là một ví dụ nhanh:

PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);

System.out.println("Contains 2? " + numberQueue.contains(2)); // In ra: Contains 2? true

Object[] array = numberQueue.toArray();
System.out.println("First element: " + array[0]); // In ra: First element: 2

Ví Dụ Thêm Một Mục Vào Hàng Chờ Ưu Tiên

Hãy kết hợp tất cả lại với một ví dụ thú vị. Tưởng tượng chúng ta đang tổ chức một bữa tiệc, và chúng ta muốn chào đón khách của mình theo thứ tự đến sớm:

import java.util.PriorityQueue;

public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();

guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));

while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Chào mừng, " + guest.name + "! Bạn đến vào " + guest.arrivalTime);
}
}

static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;

Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}

@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}

Chương trình này sẽ in ra:

Chào mừng, Bob! Bạn đến vào 18.15
Chào mừng, Alice! Bạn đến vào 18.3
Chào mừng, Charlie! Bạn đến vào 18.45

Trong ví dụ này, chúng ta đã tạo một lớp Guest tùy chỉnh và cho Java biết cách so sánh các khách dựa trên thời gian đến của họ. PriorityQueue sau đó tự động sắp xếp khách của chúng ta!

Và đó là tất cả! Bạn đã bước đầu tiên vào thế giới của PriorityQueues trong Java. Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo, vì vậy đừng sợ thử nghiệm các khái niệm này. Ai biết? Có lẽ bạn sẽ sử dụng PriorityQueue để tổ chức danh sách khách của tiệc của bạn sau!

Credits: Image by storyset