PriorityQueue sortiert, aber die zwei größten [Duplikate]

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());

AUSGABE:

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

Ich suche nach den k größten Paaren (ihrer Anzahl) in der Hashtabelle und die auf der Ausgabe sind tatsächlich die richtigen. Meine Frage ist, warum werden die letzten beiden getauscht?

Antworten

2 fps Nov 25 2020 at 11:38

PriorityQueueGibt nur das niedrigste Element von seinem Kopf zurück. Es werden nicht alle Elemente sortiert. Wenn Sie also die Warteschlange mit durchlaufen pq.toString(), werden die Elemente möglicherweise nicht in der richtigen Reihenfolge angezeigt. Dies geschieht, weil intern PriorityQueue.toString()die PriorityQueue.iterator()Methode verwendet wird und gemäß den Dokumenten:

Es iterator()ist nicht garantiert, dass der in der Methode bereitgestellte Iterator die Elemente der Prioritätswarteschlange in einer bestimmten Reihenfolge durchläuft. Wenn Sie eine bestellte Durchquerung benötigen, ziehen Sie die Verwendung in Betracht Arrays.sort(pq.toArray()).

Wenn Sie die Elemente der Prioritätswarteschlange der Reihe nach drucken möchten, sollten Sie diesen Code ändern:

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

Zu dem Folgendem:

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

Die toString () -Methode der PriorityQueue-Klasse garantiert Ihnen nicht die Reihenfolge der Elemente, da sie einen Iterator verwendet.

Ashish Nov 25 2020 at 11:28

Sie können die Reihenfolge mit der Abfragemethode wie folgt überprüfen:

Drucken Sie den Inhalt der Prioritätswarteschlange [Java].