वरीयता क्रम में क्रमबद्ध लेकिन दो सबसे बड़े [डुप्लिकेट]

Nov 25 2020
public class Pair implements Comparable<Pair>{
    public String name;
    public int number;

    public int compareTo(Pair other) {
        if (other == null) {
            return 1;
        }
        return Integer.compare(number, other.number);
    }
}
ht = new Hashtable<String, Pair>(perLen);
PriorityQueue<Pair> pq = new PriorityQueue<Pair>(k);
set = ht.keySet();
for (String i: set) {
        tmp0 = ht.get(i);
        if (tmp0.compareTo(pq.peek()) > 0) {
            if (pq.size() == k) {
                pq.remove();
            }
            pq.add(tmp0);
        }
}
System.out.println(pq.toString());

उत्पादन:

[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]

मैं हैशटेबल में k सबसे बड़ी जोड़ी (उनकी संख्या) की तलाश कर रहा हूं और आउटपुट पर वे वास्तव में सही हैं। मेरा सवाल है, आखिरी दो अदला-बदली क्यों की जाती है?

जवाब

2 fps Nov 25 2020 at 11:38

PriorityQueueकेवल सबसे कम तत्व को उसके सिर से लौटाता है। यह सभी तत्वों को क्रमबद्ध नहीं करता है, इसलिए यदि आप कतार को पार करते हैं, तो pq.toString()तत्व क्रम में प्रकट नहीं हो सकते हैं। ऐसा इसलिए होता है, क्योंकि डॉक्स के अनुसार , आंतरिक रूप से, विधि PriorityQueue.toString()का उपयोग करता है PriorityQueue.iterator()और:

विधि में प्रदान की इटरेटर iterator()है नहीं किसी विशेष क्रम में प्राथमिकता कतार के तत्वों को पार करने की गारंटी। यदि आपको ट्रैवर्सल ऑर्डर करने की आवश्यकता है, तो उपयोग करने पर विचार करें Arrays.sort(pq.toArray())

यदि आप प्राथमिकता कतार के तत्वों को क्रम में प्रिंट करना चाहते हैं, तो आपको यह कोड बदलना चाहिए:

System.out.println(pq.toString());

निम्नलिखित के लिए:

while (!pq.isEmpty()) 
    System.out.println(pq.remove());
1 BrightSoul Nov 25 2020 at 11:32

प्रायोरिटी वर्ग की स्ट्रींग () पद्धति आपको तत्वों के क्रम की गारंटी नहीं देती है क्योंकि यह एक पुनरावृत्ति का उपयोग करता है।

Ashish Nov 25 2020 at 11:28

आप पोल विधि का उपयोग करके यहां दिए गए आदेश की जांच कर सकते हैं:

प्राथमिकता कतार की प्रिंट सामग्री [जावा]