PriorityQueue sortiert, aber die zwei größten [Duplikate]
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
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 BetrachtArrays.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());
Die toString () -Methode der PriorityQueue-Klasse garantiert Ihnen nicht die Reihenfolge der Elemente, da sie einen Iterator verwendet.
Sie können die Reihenfolge mit der Abfragemethode wie folgt überprüfen:
Drucken Sie den Inhalt der Prioritätswarteschlange [Java].