THƯ VIỆN CÁC COLLECTION TRONG JAVA VÀ ÁP DỤNG.
8.3.4 Giới thiệu Queue:
Định nghĩa: Một Queue là một Collection để lưu trữ các phần tử trước khi cài đặtviêc truy cập. Bên cạnh các hoạt động Collection cơ bản , queue cung cấp việc chèn thêm , loại bỏ , và các hoạt động kiểm tra . Interface queueđược cho sau đây:
public interface Queue<E> extends Collection<E> { element();
boolean offer(E e); E peek();
E poll(); E remove(); }
Mỗi phương thức Queue tồn tại dưới hai hình thức: ( 1 ) một ném một Exception (ngoại lệ) nếu hoạt động bị lỗi , và (2) ngoài ra là trả về một giá trị đặc biệt nếu hoạt động bị lỗi (hoặc null hoặc sai , tùy thuộc vào hoạt động ) . Cấu trúc thông thường của interface được minh họa trong bảng dưới đây .
CẤU TRÚC INTERFACE HÀNG ĐỢI
Loại hoạt động Ném trả lại ngoại lệ Trả lại giá trị đặc biệt
Insert add(e) Offer(e)
Remove remove() Poll()
Examine Element() Peek()
Queue thông thường, nhưng không nhất thiết , các phần tử được truy xuất theo thứ tự First In First Out (FIFO).. Trong số các Exception là queue ưu tiên , thứ tự phần tử tùy theo giá trị của nó . Bất cứ việc sắp thứ tự nào được sử dụng , phần tử đứng đầu của queuelà các phần tử sẽ được gỡ bỏ bởi một lời gọi tới phương thức remove hoặc poll. Trong một queue FIFO , tất cả các phần tử mới được chèn vào cuối hàng đợi. Các loại queuecó thể sử dụng quy tắc vị trí khác nhau . Mỗi queuecài đặtphải xác định tính chất thứ tự của nó .
212 Có thể cài đặt để giới hạn số lượng phần tử trong queue ; queue như vậy được gọi là bị chặn. Một vài cài đặt Queue trong java.util.concurrent bị chặn, nhưng điều ngược lại với java.util.
Phương thức add, cái mà queue thừa kế từ Collection ,là chèn một phần tử trừ khi nó sẽ vi phạm các hạn chế khả năng của queue, trong trường hợp nó ném ExceptionIllegalStateException .
Phương thức offer, được sử dụng trên Queue bị chặn, khác với add duy nhất ở chỗ trả về false nếu không thể thêm được phần tử vào.
Các phương thức remove và poll, cả hai đều xóa và trả lại (giá trị ) đầu queue. Các phương remove và poll thể hiện sự khác nhau chỉ khi queue rỗng . Trong hoàn cảnh này, phương thức remove ném ra NoSuchElementException , trong khi poll trả về null.
Các phương thức peek và element trả về , nhưng không xóa phần tử đứng đầu của hàng đợi. Chúng khác nhau ở điểm : Nếu queue rỗng , phương thức element ném ra Exception NoSuchElementException , trong khi peek trả về null.
Queue thường không cho phép chèn các phần tử null. LinkedList được cài đặt từ Queue, là một ngoại lệ. Vì những lý do lịch sử , nó cho phép các phần tử null, nhưng bạn nên cẩn thận điều này , bởi vì null có thể là một giá trị trả lại đặc biệt khi sử dụng các phương thức poll và peek .
Interface Queue không định nghĩa các phương thức chặn queue, cái khá phổ biến trong lập trình song song . Những phương thứcnày , được định nghĩa trong gói interface java.util.concurrent.BlockingQueue .
Trong chương trình ví dụ sau đây , một queue được sử dụng để cài đặtmột đồng hồ đếm ngược . Queue được tải trước vào với tất cả các giá trị số nguyên từ một số quy định đến 0, theo thứ tự giảm dần . Sau đó , các giá trị được lấy ra khỏi queue và in trong khoảng thời gian một giây :
import java.util.*;
public class Countdown {
public static void main(String[] args) throws InterruptedException { int time = Integer.parseInt(args[0]);
Queue<Integer> queue = new LinkedList<Integer>(); for (int i = time; i >= 0; i--)
213 while (!queue.isEmpty()) { System.out.println(queue.remove()); Thread.sleep(1000); } } }
Trong ví dụ sau đây , một Queue ưu tiên (priority Queue) được sử dụng để SẮP XẾP một tập hợp các phần tử . Mục đích của đoạn chương trình là để kiểm tra sự sắp xếp của Queue ưu tiên:
Ví dụ:
static <E> List<E> heapSort(Collection<E> c) { Queue<E> queue = new PriorityQueue<E>(c); List<E> result = new ArrayList<E>();
while (!queue.isEmpty()) result.add(queue.remove());
return result; }
Interface Deque
Định nghĩa: Một deque là một double - ended – queue (hàng đợi 2 đầu). Một double-ended- queue là một tập hợp tuyến tính của các phần tử hỗ trợ chèn và loại bỏ các phần tử ở cả hai điểm đầu cuối. Interface Deque là một kiểu dữ liệu trừu tượng phong phú hơn cả Stack và Queue bởi vì nó cài đặt cả ngăn xếp và queue. Interface Deque , xác định phương thức để truy cập vào các phần tử ở cả hai đầu. Phương thức được cung cấp để chèn , xóa , và kiểm tra các phần tử. Các lớp tiền định nghĩa như ArrayDeque và LinkedList đều cài đặt interface Deque . Lưu ý rằng interface Deque có thể được sử dụng như last-in- first-out Stack (LIFO) và first- in-fitst-out Queue (FIFO) . Các phương thức trong interface Deque được chia thành ba phần: Thao tác chèn
214 Các phương thức addfirst và offerFirst chèn các phần tử vào đầu Deque . Các phương thứcaddLast và offerLast phần tử chèn vào cuối các ví dụ Deque . Khi Deque bị chặn, các phương thức ưa thích là offerFirst và offerLast vì addFirst hoặc addLast có thể không ném một Exception nếu Deque đầy .
Thao tác xóa
Các phương thức removeFirst và pollFirst loại bỏ các phần tử đầu ví dụ Deque . Các phương thức removeLast và pollLast loại bỏ các phần tử cuối cùng . Các phương thức pollFirst và pollLast trả lại null nếu Deque trống trong khi các phương thức removeFirst và removeLast ném một Exception trong trường hợp Deque trống .
Thao tác lấy phần tử
Các phương thức getFirst và peekFirst lấy phần tử đầu tiên của Deque. Những phương thức này không loại bỏ các giá trị từ Deque. Tương tự như vậy , các phương thức getLast và peekLast lấy phần tử cuối cùng nhưng không loại bỏ . Các phương thức getFirst và getLast ném một Exception trong trường hợp deque trống trong khi các phương thức peekFirst và peekLast trả lại NULL.
12 phương thức bao gồm chèn , loại bỏ và lấy phần tử được tóm tắt trong bảng dưới đây :
Type of First Element (Beginning of Last Element (End of Operation the Deque instance) the Deque instance)
Insert addFirst(e) addLast(e) offerFirst(e) offerLast(e) Remove removeFirst() removeLast() pollFirst() pollLast() Examine getFirst() getLast() peekFirst() peekLast()
Ngoài các phương thức cơ bản để chèn, xóa và kiểm tra một Deque, interface Deque cũng có một số phương thức được xác định trước. Một trong số đó là removeFirstOccurence , phương thức này loại bỏ xuất hiện đầu tiên của các phần tử tham số nếu nó tồn tại trong Deque. Nếu phần tử không tồn tại sau đó các trường hợp
215 Deque vẫn không thay đổi . Một phương thứctương tự là removeLastOccurence ; phương thứcnày loại bỏ sự xuất hiện cuối cùng của phần tử quy đinh nếu nó tồn tại trong trong Deque instance. Kiểu trả về của các phương thức này là boolean, và chúng trả về true nếu các phần tử tồn tại trong Deque.
216