2013-07-16 15 views
5

मैं जावा में PriorityQueue के आदेश को समझ नहीं सकता। जैसा कि मैं समझता हूं कि वे ढेर आधारित हैं और वे सम्मिलन आदेश के रूप में सटीक पुनरावृत्ति आदेश प्रदान नहीं कर सकते हैं। मैं जानना चाहता हूं कि किस आधार पर प्राथमिकता स्वयं को क्रमबद्ध करें। को देखते हुए कोड:जावा में प्राथमिकता का आदेश Queue?

polledbingo 
[bro, hepqo, first, okay, ssup, wassup, last] 
bro 
first 
hepqo 
last 
okay 
ssup 
wassup 

यहां तक ​​कि जब मैं सरणी के लिए परिवर्तित, आदेश खो दिया है:

PriorityQueue<String> pq = new PriorityQueue<String>(); 
     pq.offer("hepqo"); 
     pq.offer("bro"); 
     pq.offer("wassup"); 
     pq.offer("okay"); 
     pq.offer("bingo"); 
     pq.offer("first"); 
     pq.offer("last"); 
     pq.offer("ssup"); 
     System.out.println("polled "+pq.poll()); 
     System.out.println(pq); 
     String str[] = pq.toArray(new String[0]); 
     Arrays.sort(str); 
     for(String str1:str){ 
      System.out.println(str1); 
     } 

उत्पादन पैदा करता है।
मुझे नहीं लगता कि यह स्ट्रिंग द्वारा प्राकृतिक आदेश भी है।
क्या प्राथमिकता पंक्तियों के सम्मिलन आदेश को बनाए रखने का कोई तरीका है?
किस आधार पर उन्होंने क्रमबद्ध किया?

+0

है यही कारण है कि, वास्तव में, तार के लिए प्राकृतिक आदेश। –

+0

कैसे आते हैं ??? यह तुलनित्र द्वारा नहीं, सही ?? –

+0

यह 'स्ट्रिंग # तुलना (स्ट्रिंग)' विधि से है। ध्यान दें कि 'कतार # पोल()' कतार से तत्व को हटा देता है, यही कारण है कि "बिंगो" 'क्रमबद्ध सरणी आउटपुट में दिखाई नहीं देता है। –

उत्तर

3

कतार स्ट्रिंग्स 'लेक्सिकोग्राफिक ऑर्डर के अनुसार क्रमबद्ध है, जो उनका प्राकृतिक क्रम है (यानी' बी 'पहले से' एफ ',' एफ 'से पहले' एच ', आदि)। आप कतार प्रविष्टि आदेश में बनाए रखना चाहते हैं, तो एक वेनिला Queue बजाय जावा में एक PriorityQueue

+0

, 'was'' wassup' के बाद क्यों है ?? –

+2

@ सचिन वर्मा [toArray] से तत्वों का उत्पादन (http://docs.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html#toArray%28%29) किसी विशेष क्रम में नहीं हैं - यह केवल 'पोल', 'इटरेटर' इत्यादि है, जो कतार के आदेश –

+4

@ ज़िम-ज़मो 'पूटरोटॉट नंबर का सम्मान करने की गारंटी है।जावाडोक देखें: "विधि 'इटरेटर()' में प्रदान किया गया' इटरेटर 'किसी भी विशेष क्रम में प्राथमिकता कतार के तत्वों को पार करने की गारंटी नहीं देता है। " ऑर्डरिंग केवल 'peek()' और 'poll()' विधियों के माध्यम से प्रदान की जाती है। – EJP

-1

प्राथमिकता कतारों का उपयोग क्या कहा जाता है के एक कार्यान्वयन एक Heap (जो एक सार डेटा संरचना है) कर रहे हैं। यदि आप हीप डेटा संरचना देखते हैं, तो चाबियों (या जावा शर्तों में संग्रह तत्व) के बीच क्रम का कोई सख्त सिद्धांत नहीं है। हीप एडीटी मुख्य रूप से तेजी से सम्मिलन/हटाने और पहले तत्व के ओ (के) समय पुनर्प्राप्ति के लिए उपयोगी है (जो हीप के मामले में जड़ होगी)। तो सभी तत्वों को खोजने, तत्वों को सॉर्ट करने, या ट्रैवर्सिंग तत्वों को खोजने के लिए जावा में प्राथमिकता क्यूयू डेटा संरचना का उपयोग न करें। क्योंकि यह उन उद्देश्यों के लिए नहीं है। जावाडोक स्पष्ट रूप से बताते हैं कि वैकल्पिक संग्रह और Iterable इंटरफेस से कार्यान्वयन (यानी पर भरोसा करने के लिए कुछ नहीं कर रहे हैं, इटरेटर एक कार्यान्वयन जो आदेश और निकालने की तरह संग्रह तरीकों() की गारंटी नहीं है देता है, शामिल हैं() रैखिक समय लगेगा)

+0

बेशक वहाँ एक 'सख्त सिद्धांत' है। अन्यथा यह काम नहीं करेगा। 'सख्त सिद्धांत' यह है कि 'ए [i] <= ए [i * 2] <= ए [i * 2 + 1] '। और आप निश्चित रूप से इसे सॉर्ट करने के लिए उपयोग कर सकते हैं। 'Iterator' विधियों 'है अगला()' और 'अगला()' वैकल्पिक नहीं हैं। यहां बहुत ज्यादा भ्रम है। – EJP

संबंधित मुद्दे