Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

PriorityQueue Java

วิธีใช้ 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 ซึ่งเก็บโค้ดของเราไว้สำหรับตัวอย่างนี้ นี่คือวิธีการทำงานของโค้ดในชั้นเรียนของเรา:

  1. เราใช้ new PriorityQueue<>(); เพื่อสร้างลำดับความสำคัญที่เรียกว่า orders .
  2. เราใช้ add() วิธีเพิ่มตาราง #22 ลงในสแต็กของเรา
  3. เราพิมพ์คำว่า Orders: ตามด้วยเนื้อหาของสแต็กของเราไปยังคอนโซล
  4. เราใช้ offer() วิธีเพิ่มตาราง #17 ลงในสแต็กของเรา
  5. เราพิมพ์คำว่า 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 อย่างมืออาชีพ!