สำหรับคนส่วนใหญ่ คำว่า "คิว" ทำให้นึกถึงการเชื่อมโยงที่น่าพอใจน้อยมาก แต่วันนี้เรากำลังพูดถึงคิวต่างๆ — คิว 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);
    
องค์ประกอบแรกคือ: John
องค์ประกอบสุดท้ายคือ: Oliver
[John, Rob, Greg, Max, Oliver]

ทั้งสองวิธีส่งคืนองค์ประกอบแรก/สุดท้ายจากคิวและอย่าลบออก หากคิวว่าง ค่าnullจะถูกส่งกลับ

ทำได้ดี! วันนี้เราได้เรียนรู้วิธีการทำงานกับคิวในภาษาจาวา ตอนนี้คุณรู้วิธีใช้ในทางปฏิบัติแล้ว