2013-02-26 128 views
5

जावा में, मैं एक नया PriorityQueue नया तुलनित्र के साथ लेकिन कतार की लंबाई को देखते हुए बिना बनाने का तरीका नहीं जानते? मैं इसे कैसे बना सकता हूं?नए तुलनित्र के साथ प्राथमिकता क्यूयू कैसे बनाएं और कोई निर्दिष्ट प्रारंभिक क्षमता नहीं है?

मैं जानता हूँ कि मैं लिख सकते हैं:

Queue<Node> theQueue = new PriorityQueue<Node>(15,new Comparator<Node>(); 

लेकिन मुझे आशा है कि कतार LinkedList की तरह काम करता है, मेरा मतलब है इसकी लंबाई निश्चित नहीं है, मैं इसे कैसे घोषणा कर सकते हैं कर सकते हैं?

उत्तर

7

ऐसा कोई कन्स्ट्रक्टर नहीं है। Javadocs, the default capacity is 11 के अनुसार, ताकि आप कोई आर्ग PriorityQueue निर्माता के अनुरूप व्यवहार के लिए निर्दिष्ट कर सकते हैं:

Queue<Node> theQueue = new PriorityQueue<Node>(11,new Comparator<Node>()); 

और हाँ, the queue will grow if it needs to.

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

+0

समझ गया। और एक और सवाल: यदि मैं स्थानीय बीम खोज करना चाहता हूं, तो मुझे प्राथमिकता क्यूई को एक निश्चित संख्या तक सीमित करने की आवश्यकता है (उदाहरण के लिए: 10), मैं प्राथमिकता की लंबाई को कैसे ठीक कर सकता हूं? – lkkeepmoving

+0

आकार-बाध्य ['LinkedBlockingQueue'] का उपयोग करें (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html)। –

+0

लेकिन लिंक्डब्लॉकिंग क्यूई क्लास प्राथमिकता क्यूई से अलग तरीके से काम करता है, है ना? क्या कतार में LinkedBlockingQueue और PriorityQueue दोनों की सुविधा हो सकती है? – lkkeepmoving

1

मुझे डर है कि प्रारंभिक क्षमता निर्दिष्ट किए बिना केवल Comparator निर्दिष्ट करने का कोई तरीका नहीं है। ध्यान दें कि यह केवल प्रारंभिक क्षमता है - कतार इस प्रारंभिक मूल्य से बढ़ सकती है।

1

जावा संस्करण 8 से शुरू एक नया निर्माता जो कुछ नहीं कर सकता है कि आप क्या पूछते हैं: PriorityQueue (तुलनाकारी तुलनित्र)

तो तुम मिलेगा:

Queue<Node> theQueue = new PriorityQueue<>(new Comparator<Node>()); 
+0

डॉक से: 'डिफ़ॉल्ट आरंभिक क्षमता के साथ एक PriorityQueue बनाता है और जिसका तत्वों निर्दिष्ट comparator.' के अनुसार आदेश दिया जाता है तो, यह अभी भी 11 xD – Enissay

0

आप स्वयं के साथ एक प्राथमिकता कतार बना सकते हैं जावा लैम्ब्डा, जावा SE 8.

उदाहरण के लिए एक सुविधा का उपयोग करके आकार फिक्सिंग के बिना परिभाषित तुलनित्र, आप कर सकते हैं:

PriorityQueue<String> pq = new PriorityQueue<>((s1, s2) -> s1.compareTo(s2));

लैम्ब्डा के बारे में उदाहरण देखें: https://www.mkyong.com/java8/java-8-lambda-comparator-example/