สำหรับคนส่วนใหญ่ คำว่า "คิว" ทำให้นึกถึงการเชื่อมโยงที่น่าพอใจน้อยมาก แต่วันนี้เรากำลังพูดถึงคิวต่างๆ — คิว Java ใน Java คิวคืออะไรก็ตามที่สืบทอด อินเทอร์เฟ ซคิวซึ่งจะขยาย อินเทอร์ เฟซคอลเลก ชัน ซึ่งหมายความว่าสามารถจัดคิวได้เหมือนคอลเลกชัน
Queues ใน Java รองรับหลักการทำงานสองประการ: FIFOและLIFO
หลักการFIFO (เข้าก่อนออกก่อน) ควบคุมคิวปกติ องค์ประกอบแรกที่เพิ่มเข้าในคิวคือองค์ประกอบแรกที่ออกจากคิว
หลักการLIFO (Last In, First Out) อธิบายพฤติกรรมของสแต็ก — องค์ประกอบสุดท้ายที่เพิ่มลงในคิวคือองค์ประกอบแรกที่ปล่อยให้สแต็ก ตัวอย่างเช่น นี่คือวิธีที่คุณทำงานกับสำรับไพ่: คุณนำไพ่ออกจากไพ่ใบบนสุดทีละใบจนกว่าจะถึงด้านล่างสุดของสำรับ
ลำดับชั้นคิวใน Java มีลักษณะดังนี้:

ที่นี่ คุณจะเห็นว่าQueue มีคลาสการ ใช้งาน 3 คลาส: LinkedList , ArrayDequeและPriorityQueue LinkedListและArrayDequeสืบทอดโดยตรงไม่ใช่Queueแต่Deque
Dequeเป็นอินเตอร์เฟสที่เพิ่มเข้ามาใน Java 6 ซึ่งรวมถึงเมธอดต่างๆ ที่มีประโยชน์สำหรับคิวและอนุญาตให้คิวทำหน้าที่เป็นคิวสองปลาย (หรือสองทิศทาง) นั่นหมายความ ว่าอาจเป็นFIFOและLIFO
หนึ่งใน สองลูกหลานของอิน เท อร์เฟ ซ DequeคือArrayDeque รองรับคิวแบบ doubled-ended ที่ให้คุณแทรกและลบองค์ประกอบจากปลายทั้งสองด้าน นอกจากนี้ยังเป็นอาร์เรย์ไดนามิกที่จะขยายขนาดโดยอัตโนมัติ
นอกจากนี้ ยังมี คลาส PriorityQueueซึ่งเป็นลูกหลานโดยตรงของQueue : มันทำงานแตกต่างจากคลาสที่ใช้Deque
PriorityQueueเป็นคิวลำดับความสำคัญที่จัดระเบียบองค์ประกอบตามลำดับตามธรรมชาติโดยค่าเริ่มต้น ที่นี่การเรียงลำดับใช้อินเทอร์เฟซเปรียบเทียบและตัวเปรียบเทียบ หลักการเหมือนกับ TreeSetหรือ TreeMap — คลาสที่ใช้ อินเทอร์เฟซ Comparableและมีลำดับการจัดเรียงของตัวเอง
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());
}
หากคุณเรียกใช้ตัวอย่างนี้ นี่คือสิ่งที่คุณจะเห็นในคอนโซล:
จอห์น แอ
นดรูว์
เนื่องจากเรากำลังทำงานกับคิว ไม่ใช่การรวบรวมแบบปกติ เราจำเป็นต้องลบองค์ประกอบออกจากรายการ ในการทำเช่นนี้ เราใช้โครงสร้างนี้:
while (!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.remove());
}
อิน เทอร์เฟซ Dequeสืบทอด เมธอด Queueและเพิ่มเมธอดที่น่าสนใจของตัวเอง:
เป็นโมฆะ addFirst (E obj) | เพิ่ม องค์ประกอบ objที่ด้านหน้าของคิว |
เป็นโมฆะ addLast (E obj) | เพิ่ม องค์ประกอบ objที่ส่วนท้ายของคิว |
ได้รับครั้งแรก () | ส่งกลับองค์ประกอบแรกจากคิว |
อี getLast() | ส่งกลับองค์ประกอบสุดท้ายจากคิว |
บูลีน offerFirst(E obj) | เพิ่ม องค์ประกอบ objที่ด้านหน้าของคิว และส่งกลับค่าจริงหากมีการเพิ่มองค์ประกอบ มิฉะนั้น จะคืนค่าเป็นเท็จ |
ข้อเสนอบูลีนสุดท้าย (E obj) | เพิ่ม องค์ประกอบ objที่ส่วนท้ายของคิว และส่งกลับค่าจริงหากมีการเพิ่มองค์ประกอบ มิฉะนั้น จะคืนค่าเป็นเท็จ |
อี рор() | รับองค์ประกอบแรกจากคิวและลบออก |
โมฆะ push(E obj) | เพิ่ม องค์ประกอบ objที่ด้านหน้าของคิว |
E peekFirst() | ส่งกลับ (แต่ไม่ลบ) องค์ประกอบแรกจากคิว |
E peekLast() | ส่งกลับ (แต่ไม่ลบ) องค์ประกอบสุดท้ายจากคิว |
E การสำรวจความคิดเห็นครั้งแรก () | ส่งกลับและลบองค์ประกอบแรกออกจากคิว คืนค่าnullหากไม่มีองค์ประกอบ |
E แบบสำรวจล่าสุด () | ส่งกลับและลบองค์ประกอบสุดท้ายออกจากคิว คืนค่าnullหากไม่มีองค์ประกอบ |
E ลบสุดท้าย () | ส่งกลับและลบองค์ประกอบแรกของคิว ส่งข้อยกเว้นหากไม่มีองค์ประกอบ |
E ลบก่อน () | ส่งกลับและลบองค์ประกอบสุดท้ายของคิว ส่งข้อยกเว้นหากไม่มีองค์ประกอบ |
บูลีน removeFirstOccurrence (Object obj) | ลบobj ที่เกิดขึ้นครั้งแรก ออกจากคิว |
บูลีน removeLastOccurrence (Object obj) | ลบ objที่เกิดขึ้นล่าสุดออกจากคิว |
มาดูวิธีปฏิบัติเหล่านี้กัน
ขั้นแรก ให้เพิ่มองค์ประกอบในคิว:
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);
ตอนนี้มารับค่าจากคิว:
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());
}
รหัสนี้แสดงองค์ประกอบแรกและองค์ประกอบสุดท้ายของคิว
องค์ประกอบสุดท้ายคือ: สับปะรด
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);
เรียกใช้รหัสนี้ เราได้รับ:
แอปเปิ้ลส้ม
[สับปะรด, มะนาว]
ข้อแตกต่างระหว่างpop()และpoll()คือpop()จะโยนNoSuchElementExceptionหากรายการเป็นรายการว่าง แต่poll ()จะส่งคืนค่า null
ตอนนี้เราจะพิจารณาเมธอดpollFirst()และ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);
มะนาว
[แอปเปิ้ล สับปะรด]
ทั้งสองวิธีส่งคืนและลบค่าออกจากคิว
นี่คือตัวอย่างการใช้เมธอดpeekFirst()และ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);
องค์ประกอบสุดท้ายคือ: Oliver
[John, Rob, Greg, Max, Oliver]
ทั้งสองวิธีส่งคืนองค์ประกอบแรก/สุดท้ายจากคิวและอย่าลบออก หากคิวว่าง ค่าnullจะถูกส่งกลับ
ทำได้ดี! วันนี้เราได้เรียนรู้วิธีการทำงานกับคิวในภาษาจาวา ตอนนี้คุณรู้วิธีใช้ในทางปฏิบัติแล้ว
GO TO FULL VERSION