Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

जावा में PriorityQueue का उपयोग कैसे करें

जावा में PriorityQueue का उपयोग कैसे करें

प्रोग्रामिंग में प्राथमिकता कतारों का उपयोग डेटा संरचनाएँ बनाने के लिए किया जाता है जहाँ उच्चतम मूल्य वाले डेटा आइटम को संरचना द्वारा पहले प्रोसेस किया जाना चाहिए।

जब आप जावा में कोडिंग कर रहे होते हैं, तो आप ऐसी स्थिति का सामना कर सकते हैं जहाँ आप प्राथमिकता कतार को लागू करना चाहते हैं। यहीं पर जावा Queue इंटरफ़ेस आता है। हालाँकि, क्योंकि Queue एक इंटरफ़ेस है, आप इसे सीधे अपने कोड में लागू नहीं कर सकते। यदि आप हीप डेटा संरचना के साथ प्राथमिकता कतार बनाना चाहते हैं, तो आप इसके बजाय PriorityQueue का उपयोग करना चाहेंगे।

यह ट्यूटोरियल जावा में PriorityQueue की मूल बातों पर चर्चा करेगा और यह पता लगाएगा कि कतार कैसे बनाई जाए। यह ट्यूटोरियल उन मुख्य विधियों का भी पता लगाएगा जो PriorityQueue द्वारा प्रदान की जाती हैं जिनका उपयोग कतार की सामग्री को पुनर्प्राप्त करने और हेरफेर करने के लिए किया जा सकता है।

जावा कतारें और PriorityQueues

कतारें, स्टैक की तरह, डेटा संरचनाएँ हैं जिनमें ऑपरेशन किए जाने का एक विशिष्ट क्रम होता है। कतारों के मामले में, ऑपरेशन फर्स्ट-इन, फर्स्ट-आउट (FIFO) क्रम में किए जाते हैं। इसका मतलब है कि सूची में पहला आइटम हमेशा पहला बाहर होगा - कतार तत्वों के क्रम में क्रमबद्ध होती है जैसे वे डाले जाते हैं।

मान लीजिए आप एक रेस्तरां में हैं, और आपने एक ऑर्डर दिया है। आप चाहते हैं कि प्रत्येक ग्राहक द्वारा अपना भोजन ऑर्डर करने के क्रम में सेवा दी जाए, क्योंकि यह सबसे निष्पक्ष दृष्टिकोण है। तो, अगर आपने जैक के बाद अपना भोजन ऑर्डर किया, तो आप जैक के तुरंत बाद सेवा प्राप्त करना चाहेंगे। यह एक कतार का उदाहरण है।

इस ट्यूटोरियल के उद्देश्यों के लिए, हम Queue इंटरफ़ेस के PriorityQueue कार्यान्वयन पर ध्यान केंद्रित करने जा रहे हैं, जिसका उपयोग जावा में प्राथमिकता कतार बनाने के लिए किया जाता है।

PriorityQueues एक प्रकार की कतार है जिसके तत्व उनकी प्राथमिकता के आधार पर क्रमबद्ध होते हैं। इसका मतलब है कि 5 और 10 मानों वाली कतार में, 10 हर समय कतार की शुरुआत में होगा, भले ही इसे अंत में जोड़ा गया हो।

प्राथमिकता कतार बनाएं

जावा में प्राथमिकता कतार बनाने के लिए, आपको पहले java.util.PriorityQueue पैकेज आयात करना होगा। इस पैकेज में PriorityQueue विधि होती है जिसका उपयोग हम अपनी कतार बनाने के लिए कर सकते हैं। हम PriorityQueue पैकेज को इस कोड का उपयोग करके आयात कर सकते हैं:

81% प्रतिभागियों ने कहा कि बूटकैंप में भाग लेने के बाद उन्हें अपनी तकनीकी नौकरी की संभावनाओं के बारे में अधिक आत्मविश्वास महसूस हुआ। आज ही बूटकैंप से मिलान करें।

औसत बूटकैंप स्नातक ने बूटकैंप शुरू करने से लेकर पहली नौकरी खोजने तक कैरियर परिवर्तन में छह महीने से कम समय बिताया।

import java.util.PriorityQueue;

अब हमने PriorityQueue आयात कर लिया है, हम पैकेज का उपयोग करके एक कतार बना सकते हैं। PriorityQueue बनाने के लिए उपयोग किया जाने वाला सिंटैक्स यहाँ है:

PriorityQueue<DataType> queue_name = new PriorityQueue<>();

आइए इसे तोड़ें:

  • PriorityQueue हमारे प्रोग्राम को बताता है कि हम प्राथमिकता कतार बनाना चाहते हैं।
  • DataType वह डेटा प्रकार है जिसे हमारी कतार संग्रहीत करेगी।
  • queue_name उस चर का नाम है जिसे हमारे द्वारा बनाई गई कतार को सौंपा जाएगा।
  • new PriorityQueue(); एक प्राथमिकता कतार को आरंभ करता है।

तो, मान लीजिए हम एक कतार बनाना चाहते हैं जो हमारे रेस्तरां में ग्राहकों के ऑर्डर संग्रहीत करती है। हम चाहते हैं कि हमारी कतार प्रत्येक ग्राहक की टेबल संख्या संग्रहीत करे। हम निम्न कोड का उपयोग करके इस स्टैक को बना सकते हैं:

PriorityQueue<Integer> orders = new PriorityQueue<>();

इस उदाहरण में, हमने orders नामक PriorityQueue का एक उदाहरण बनाया है जो पूर्णांक मान संग्रहीत करता है। हमारी कतार में, तत्वों को FIFO डेटा संरचना का उपयोग करके एक्सेस और हटाया जाएगा।

PriorityQueue में आइटम जोड़ें

जावा में, कतार में प्रत्येक तत्व को एक आइटम कहा जाता है।

कतार में एक आइटम जोड़ने के लिए, हम add() विधि का उपयोग कर सकते हैं। यह विधि एक पैरामीटर स्वीकार करती है: उस आइटम का मान जिसे आप अपनी कतार में जोड़ना चाहते हैं। यदि कतार भरी हुई है, तो add() विधि एक अपवाद फेंक देगी।

इसके अलावा, हम कतार में एक आइटम जोड़ने के लिए offer() विधि का उपयोग कर सकते हैं। add() और offer() के बीच अंतर यह है कि यदि कतार भरी हुई है तो offer() false लौटाता है, जबकि 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. हम अपनी स्टैक में टेबल #22 जोड़ने के लिए add() विधि का उपयोग करते हैं।
  3. हम कंसोल पर Orders: शब्द के बाद हमारी स्टैक की सामग्री प्रिंट करते हैं।
  4. हम अपनी स्टैक में टेबल #17 जोड़ने के लिए offer() विधि का उपयोग करते हैं।
  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.

आइए हमारे कोड को तोड़ें। पहले, हमने अपनी स्टैक में स्थिति 2 पर ऑर्डर को हटाने के लिए remove() विधि का उपयोग किया। इसने ऑर्डर #17 को हटा दिया।

फिर हमारे कोड ने एक संदेश प्रिंट किया जिसमें कहा गया, Was order #17 removed? इसके बाद remove() विधि का परिणाम। remove() ने सफलतापूर्वक #17 को हमारी स्टैक से हटा दिया, इसलिए विधि ने true लौटाया।

अगला, हमने अपनी स्टैक में शीर्ष आइटम को हटाने के लिए poll() विधि का उपयोग किया। इस मामले में, वह ऑर्डर #22 था। poll() ने ऑर्डर #22 को हटा दिया और हटाए गए आइटम को लौटाया। आइटम हटाए जाने के बाद, हमने कंसोल पर संदेश Order #[removed order number] 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 क्लास के साथ उपयोग की जाती हैं। ये इस प्रकार हैं:

विधि नामविवरण
size()कतार की लंबाई लौटाता है।
toArray()कतार को एक सरणी में परिवर्तित करता है।
contains(elementName)कतार में एक तत्व खोजता है।

निष्कर्ष

PriorityQueue क्लास का उपयोग जावा में Queue इंटरफ़ेस को लागू करने के लिए किया जाता है। कतारें FIFO डेटा संरचना का उपयोग करती हैं, इसलिए पहला आइटम अंदर पहला बाहर होता है।

यह ट्यूटोरियल जावा में कतारों और PriorityQueues की मूल बातों के माध्यम से चला। हमने यह भी चर्चा की कि कतार कैसे बनाई जाए और कतार से आइटम पुनर्प्राप्त करने और हेरफेर करने के लिए आप जिन मुख्य विधियों का उपयोग कर सकते हैं।

अब आपके पास जावा PriorityQueue क्लास का उपयोग एक प्रो की तरह शुरू करने के लिए आवश्यक उपकरण हैं!

  1. क्या Java में Swing थ्रेड-सेफ है? क्या Java में Swing थ्रेड-सेफ है?

    नहीं, Java Swing कंपोनेंट्स Java में थ्रेड-सेफ नहीं हैं। क्यों Swing कंपोनेंट्स थ्रेड-सेफ नहीं हैं Java Swing के थ्रेड-सेफ न होने का एक मुख्य कारण इसके कंपोनेंट्स को एक्सटेंड करने के कार्य को सरल बनाना है। Java Swing के थ्रेड-सेफ न होने का एक अन्य कारण लॉक्स प्राप्त करने और जारी करने और स्टेट को र

  1. - Java में नेस्टेड इंटरफेस (Nested Interface)

    हम किसी अन्य इंटरफेस या क्लास के अंदर एक इंटरफेस घोषित कर सकते हैं। ऐसे इंटरफेस को नेस्टेड इंटरफेस (Nested Interface) कहा जाता है। नेस्टेड इंटरफेस को नियंत्रित करने वाले निम्नलिखित नियम हैं: एक इंटरफेस के भीतर घोषित नेस्टेड इंटरफेस public होना चाहिए। एक क्लास के भीतर घोषित नेस्टेड इंटरफेस का कोई

  1. - Java में इंटरफेस (Interface)

    एक इंटरफेस Java में एक रेफरेंस टाइप है। यह एक क्लास के समान है। यह एब्स्ट्रैक्ट मेथड्स का एक संग्रह है। एक क्लास इंटरफेस को इम्प्लीमेंट करती है, जिससे इंटरफेस के एब्स्ट्रैक्ट मेथड्स विरासत में मिलते हैं। एब्स्ट्रैक्ट मेथड्स के साथ, एक इंटरफेस में कॉन्स्टेंट्स, डिफ़ॉल्ट मेथड्स, स्टेटिक मेथड्स, और न