วิธีใช้ PriorityQueue ใน Java
คิวลำดับความสำคัญใช้ในการเขียนโปรแกรมเพื่อสร้างโครงสร้างข้อมูลโดยที่โครงสร้างควรประมวลผลรายการข้อมูลที่มีค่าสูงสุดก่อน
เมื่อคุณเขียนโค้ดใน Java คุณอาจพบสถานการณ์ที่คุณต้องการนำลำดับความสำคัญไปใช้ นั่นคือที่มาของอินเทอร์เฟซ Java Queue อย่างไรก็ตาม เนื่องจาก Queue เป็นอินเทอร์เฟซ คุณจึงไม่สามารถติดตั้งลงในโค้ดของคุณได้โดยตรง หากคุณต้องการสร้างคิวลำดับความสำคัญด้วยโครงสร้างข้อมูลฮีป คุณจะต้องใช้ PriorityQueue แทน
บทช่วยสอนนี้จะกล่าวถึงพื้นฐานของ PriorityQueue ใน Java และสำรวจวิธีสร้างคิว บทแนะนำนี้จะสำรวจวิธีการหลักที่นำเสนอโดย PriorityQueue ซึ่งสามารถใช้เพื่อดึงและจัดการเนื้อหาของคิวได้
คิว Java และคิวลำดับความสำคัญ
คิว เช่น สแต็ค เป็นโครงสร้างข้อมูลที่มีลำดับเฉพาะในการดำเนินการ ในกรณีของคิว การดำเนินการจะดำเนินการในลำดับเข้าก่อนออกก่อน (FIFO) ซึ่งหมายความว่ารายการแรกในรายการจะเป็นรายการแรกเสมอ — คิวจะเรียงลำดับตามองค์ประกอบที่แทรก
สมมติว่าคุณอยู่ในร้านอาหาร และคุณได้สั่งซื้อ คุณจะต้องการเสิร์ฟตามลำดับเวลาที่ลูกค้าแต่ละรายสั่งอาหาร เพราะนั่นเป็นแนวทางที่ยุติธรรมที่สุด ดังนั้น หากคุณสั่งอาหารตามแจ็ค คุณก็จะต้องการเสิร์ฟทันทีหลังจากแจ็ค นั่นเป็นตัวอย่างของคิว
สำหรับจุดประสงค์ของบทช่วยสอนนี้ เราจะเน้นที่การใช้งาน PriorityQueue ของอินเทอร์เฟซ Queue ซึ่งใช้ในการสร้างลำดับความสำคัญใน Java
PriorityQueues เป็นประเภทของคิวที่มีการจัดลำดับองค์ประกอบตามลำดับความสำคัญ ซึ่งหมายความว่าในคิวที่มีค่า 5 และ 10 จะมี 10 อยู่ที่จุดเริ่มต้นของคิวตลอดเวลา แม้ว่าจะถูกเพิ่มเข้ามาล่าสุด
สร้างคิวลำดับความสำคัญ
ในการสร้างลำดับความสำคัญใน Java คุณต้องนำเข้า java.util.PriorityQueue
ก่อน บรรจุุภัณฑ์. แพ็คเกจนี้มีเมธอด PriorityQueue ที่เราสามารถใช้สร้างคิวของเราได้ เราสามารถนำเข้าแพ็คเกจ PriorityQueue โดยใช้รหัสนี้:
81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้
ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก
import java.util.PriorityQueue;
ตอนนี้เราได้นำเข้า PriorityQueue แล้ว เราสามารถสร้างคิวโดยใช้แพ็คเกจได้ นี่คือไวยากรณ์ที่ใช้สร้าง PriorityQueue:
PriorityQueue<DataType> queue_name = new PriorityQueue<>();
มาทำลายสิ่งนี้กันเถอะ:
- ลำดับความสำคัญของคิว บอกโปรแกรมของเราว่าเราต้องการสร้างคิวลำดับความสำคัญ
- ประเภทข้อมูล คือประเภทของข้อมูลที่คิวของเราจะจัดเก็บ
- queue_name เป็นชื่อของตัวแปรที่จะกำหนดคิวที่เราสร้าง
- ลำดับความสำคัญใหม่(); เริ่มต้นคิวลำดับความสำคัญ
สมมติว่าเราต้องการสร้างคิวที่เก็บคำสั่งซื้อของลูกค้าในร้านอาหารของเรา เราต้องการให้คิวของเราเก็บหมายเลขโต๊ะของลูกค้าแต่ละราย เราสามารถสร้างสแต็กนี้โดยใช้รหัสต่อไปนี้:
PriorityQueue<Integer> orders = new PriorityQueue<>();
ในตัวอย่างนี้ เราได้สร้างอินสแตนซ์ของ PriorityQueue ชื่อ orders
ซึ่งเก็บค่าจำนวนเต็ม ในคิวของเรา องค์ประกอบจะเข้าถึงและลบโดยใช้โครงสร้างข้อมูล FIFO
เพิ่มรายการไปยัง PriorityQueue
ใน Java แต่ละองค์ประกอบในคิวเรียกว่า item
.
ในการเพิ่มรายการในคิว เราสามารถใช้ add()
กระบวนการ. เมธอดนี้ยอมรับหนึ่งพารามิเตอร์:ค่าของรายการที่คุณต้องการเพิ่มในคิวของคุณ หากคิวเต็ม add()
เมธอดจะคืนค่าข้อยกเว้น
นอกจากนี้เรายังสามารถใช้ offer()
วิธีการเพิ่มรายการในคิว ความแตกต่างระหว่าง add()
และ offer()
นั่นคือ offer()
คืนค่าเท็จหากคิวเต็มในขณะที่ add()
ส่งข้อยกเว้น
สมมติว่าเราต้องการเพิ่มตาราง #22 และ #17 ลงในสแต็กของเราเพราะพวกเขาเพิ่งสั่งอาหารกลางวัน เราสามารถทำได้โดยใช้รหัสนี้:
import java.util.PriorityQueue; class AddCustomer { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); System.println("Orders: " + orders); orders.offer(17); System.out.println("Updated orders: " + orders); } }
รหัสของเราส่งคืน:
Orders: [22] Updated orders: [22, 17]
มาทำลายตัวอย่างของเรากัน อันดับแรก เรานำเข้าคลาส PriorityQueue ซึ่งเราใช้ในภายหลังในโค้ดของเรา จากนั้นเราประกาศคลาสที่เรียกว่า AddCustomer ซึ่งเก็บโค้ดของเราไว้สำหรับตัวอย่างนี้ นี่คือวิธีการทำงานของโค้ดในชั้นเรียนของเรา:
- เราใช้
new PriorityQueue<>();
เพื่อสร้างลำดับความสำคัญที่เรียกว่าorders
. - เราใช้
add()
วิธีเพิ่มตาราง #22 ลงในสแต็กของเรา - เราพิมพ์คำว่า
Orders:
ตามด้วยเนื้อหาของสแต็กของเราไปยังคอนโซล - เราใช้
offer()
วิธีเพิ่มตาราง #17 ลงในสแต็กของเรา - เราพิมพ์คำว่า
Updated orders:
ตามด้วยเนื้อหาที่แก้ไขของสแต็กของเราไปยังคอนโซล
22 จะปรากฏเป็นอันดับแรกในสแต็กของเรา ดังนั้นมันจึงจะเป็นอันแรกเมื่อเราลบองค์ประกอบ กล่าวอีกนัยหนึ่ง ตาราง # 22 อยู่ที่ด้านบนสุดของสแต็กของเรา ตาราง #17 ถูกเก็บไว้ในตำแหน่งที่สองในสแต็กของเรา โปรดจำไว้ว่า ลำดับความสำคัญของคิวจะถูกจัดลำดับในลำดับ FIFO
รหัสของเราส่งคืนอาร์เรย์ที่มีคำสั่งซื้อเดิมของเรา จากนั้นจึงส่งอาร์เรย์ที่มีคำสั่งซื้อที่อัปเดต
ลบรายการออกจาก PriorityQueue
มีสองวิธีที่สามารถนำมาใช้เพื่อลบรายการออกจาก PriorityQueue:
remove()
ลบอินสแตนซ์เดียวขององค์ประกอบออกจากคิวpoll()
ลบองค์ประกอบแรกออกจากคิวและส่งคืนรายการที่ถูกลบ
สมมติว่า ซู-เชฟ ของเราประมวลผลคำสั่งซื้อ #17 และต้องการนำออกจากกอง หลังจากประมวลผลคำสั่งซื้อนั้นแล้ว เชฟของเราก็ได้เตรียมคำสั่งซื้อ #22 และต้องการนำออกจากกอง
คำสั่งซื้อ #17 อยู่ที่ตำแหน่ง 2 ในกลุ่มของเรา และคำสั่งซื้อ #22 อยู่ที่ตำแหน่ง 1 เราต้องการลบรายการเหล่านี้ในลำดับนั้น เราสามารถใช้รหัสนี้เพื่อลบคำสั่งซื้อ:
import java.util.PriorityQueue; class RemoveOrders { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); boolean removed = orders.remove(2); System.out.println("Was order #17 removed?" + removed); int second_removed = orders.poll(); System.out.println("Order #" + second_removed + " was removed from the queue."); } }
รหัสของเราส่งคืน:
Was order #17 removed? true Order #22 was removed from the queue.
มาทำลายรหัสของเรากัน ขั้นแรก เราใช้ remove()
วิธีการลบคำสั่งที่ตำแหน่ง 2 ในกองของเรา คำสั่งนี้ถูกลบ #17.
จากนั้นรหัสของเราก็พิมพ์ข้อความว่า Was order #17 removed?
ตามด้วยผลลัพธ์ของ remove()
กระบวนการ. remove()
ลบ #17 ออกจากสแต็กของเราสำเร็จ ดังนั้นเมธอดกลับเป็นจริง
ต่อไป เราใช้ poll()
วิธีการลบรายการบนสุดในกองของเรา ในกรณีนี้ นั่นคือคำสั่ง #22 poll()
ลบคำสั่ง #22 และส่งคืนสินค้าที่ถูกลบ หลังจากที่สินค้าถูกลบออก เราก็พิมพ์ข้อความ Order #[order number removed] was removed from the queue.
ไปที่คอนโซล
ดึงไอเทม
peek()
เมธอดใช้เพื่อดึงส่วนหัวของรายการคิว (รายการแรกในคิว) สมมติว่าเราต้องการทราบมูลค่าของลำดับถัดไปในกลุ่มของเรา เนื่องจากซูสเชฟของเราพร้อมที่จะรับออร์เดอร์ใหม่
เราสามารถใช้รหัสนี้เพื่อดึงหมายเลขโต๊ะของลูกค้าที่อยู่ในบรรทัดต่อไป:
import java.util.PriorityQueue; class RetrieveOrder { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); int next_order = orders.peek(); System.out.println("The next order to be processed is table #" + next_order + "."); } }
รหัสของเราส่งคืน:
The next order to be processed is table #22.
รายการแรกในสแต็กของเราคือ 22 ดังนั้นเมื่อเราใช้ peek()
เมธอด โปรแกรมของเราจะคืนค่า 22 ในบรรทัดสุดท้ายของโค้ด เราพิมพ์ข้อความระบุว่า The next order to be processed is table #[number of first order in stack].
โดยที่จำนวนคำสั่งแรกในสแต็กถูกค้นพบโดย peek()
.
วนซ้ำผ่านคิวลำดับความสำคัญ
บ่อยครั้งเมื่อคุณทำงานกับคิว คุณจะต้องสร้างตัววนซ้ำเหนือองค์ประกอบของคิวลำดับความสำคัญ
ในการทำเช่นนั้น เราสามารถใช้ iterator()
เมธอด ซึ่งเป็นส่วนหนึ่งของแพ็คเกจ java.util.Iterator แต่ก่อนที่เราจะใช้ iterator()
วิธีแรก เราต้องนำเข้าแพ็คเกจ Iterator โดยใช้รหัสนี้:
import java.util.Iterator;
สมมติว่าเราต้องการพิมพ์รายการของทุกรายการในคิวการสั่งซื้อร้านอาหารของเราไปที่คอนโซล เราสามารถทำได้โดยใช้รหัสนี้:
import java.util.PriorityQueue; import java.util.Iterator; class PrintOrders { public static void main(String[] args) { PriorityQueue<Integer> orders = new PriorityQueue<>(); orders.add(22); orders.add(17); orders.add(14); orders.add(19); Iterator<Integer> iterate = orders.iterator(); while(iterate.hasNext()) { System.out.println(iterate.next()); } } }
รหัสของเราส่งคืน:
22 17 14 19
ในโค้ดของเรา ขั้นแรกเราจะเพิ่มค่าสี่ค่าลงในคิวของเรา จากนั้นเราก็ใช้ iterator()
วิธีการสร้างตัววนซ้ำที่เราสามารถใช้เพื่อผ่านทุกรายการในคิวลำดับความสำคัญของเรา จากนั้นเราก็สร้าง while
วนซ้ำที่ไหลผ่านทุกรายการในตัววนซ้ำของเรา — สำหรับทุกรายการใน orders
คิว — และพิมพ์ค่าถัดไปในคิว
วิธี PriorityQueue เพิ่มเติม
มีอีกสามวิธีที่มักใช้กับคลาส PriorityQueue ดังต่อไปนี้:
ชื่อวิธีการ | คำอธิบาย |
ขนาด() | คืนค่าความยาวของคิว |
toArray() | แปลงคิวเป็นอาร์เรย์ |
ประกอบด้วย (ชื่อองค์ประกอบ) | ค้นหาคิวสำหรับองค์ประกอบ |
บทสรุป
คลาส PriorityQueue ใช้ใน Java เพื่อนำอินเทอร์เฟซ Queue ไปใช้ คิวใช้โครงสร้างข้อมูล FIFO ดังนั้นรายการแรกที่อยู่ในรายการแรกคือรายการแรก
บทแนะนำนี้จะอธิบายเกี่ยวกับพื้นฐานของคิวและ PriorityQueues ใน Java นอกจากนี้เรายังได้พูดคุยถึงวิธีสร้างคิวและวิธีการหลักที่คุณสามารถใช้เพื่อดึงรายการและจัดการคิว
ตอนนี้คุณมีเครื่องมือที่จำเป็นสำหรับเริ่มใช้คลาส Java PriorityQueue อย่างมืออาชีพ!