2013-07-16 12 views
5

Ich kann die Reihenfolge von PriorityQueue in Java nicht verstehen. Wie ich verstehe, sind sie heap-basiert und sie können keine exakte Iterationsreihenfolge als Einfügereihenfolge liefern. Ich möchte dann wissen auf welcher Basis priorityQueue sich selbst sortieren. Gegeben Code:Reihenfolge der PrioritätQueue in Java?

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

erzeugt eine Ausgabe:

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

Selbst wenn ich es zu Array umwandeln, die Ordnung verloren.
Ich kann nicht glauben, dass dies sogar NATURAL ORDERING von String ist.
Gibt es eine Möglichkeit, die Reihenfolge der Prioritätswarteschlangen beizubehalten?
Auf welcher Grundlage haben sie sortiert?

+0

Das ist in der Tat natürliche Reihenfolge für Strings. –

+0

wie kommt ??? Es ist nicht durch Komparator, richtig? –

+0

Es ist durch die 'String # compareTo (String)' Methode. Beachten Sie, dass 'Queue # poll()' ein Element aus der Queue entfernt, weshalb '' bingo ''in der sortierten Array-Ausgabe überhaupt nicht erscheint. –

Antwort

3

Die Warteschlange sortiert nach der lexikographischen Reihenfolge der Zeichenfolgen, was ihrer natürlichen Reihenfolge entspricht (d. H. "B" geht vor "f", "f" geht vor "h" usw.). Wenn Sie die Warteschlange halten Auftrag mögen, verwenden Sie dann eine Vanille Queue anstelle eine PriorityQueue

+0

in meiner Ausgabe, warum ist 'last' ist nach' wassup' ?? –

+2

@Sachin Verma Die Elemente Ausgabe von [toArray] (http://docs.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html#toArray%28%29) sind in keiner bestimmten Reihenfolge - es ist nur 'poll',' iterator', usw., die garantiert die Reihenfolge der Warteschlange respektieren –

+4

@ Zim-ZamO'Pootertoot Nr.Siehe Javadoc: "Der' Iterator', der in der Methode 'iterator()' bereitgestellt wird, kann die Elemente der Prioritätswarteschlange in keiner bestimmten Reihenfolge durchlaufen. " Die Sortierung erfolgt nur über die Methoden 'peek()' und 'poll()'. – EJP

-1

Die Prioritäts-Warteschlangen in Java ist eine Implementierung der sogenannten ein Heap (das ist eine abstrakte Datenstruktur). Wenn Sie die Heap-Datenstruktur betrachten, gibt es kein striktes Prinzip der Anordnung unter den Schlüsseln (oder den Auflistungselementen in Java-Begriffen). Heap ADT eignet sich hauptsächlich für schnelles Einfügen/Löschen und O (K) -Zeitabruf des ersten Elements (welches die Wurzel im Falle des Heaps sein wird). Verwenden Sie daher die Datenstruktur "PriorityQueue" in Java nicht zum Suchen aller Elemente, zum Sortieren von Elementen oder zum Versetzen von Elementen. Weil es nicht für diese Zwecke gedacht ist. Das Javadoc weist klar darauf hin, dass die optionalen Implementierungen von Collection und Iterable Interfaces nicht etwas sind, auf das man sich verlassen kann (dh Iterator gibt eine Implementierung zurück, die die Reihenfolge nicht garantiert und die Collection-Methoden remove(), contains() nehmen lineare Zeit)

+0

Natürlich gibt es ein "strenges Prinzip". Sonst würde es nicht funktionieren. Das "strikte Prinzip" ist das "A [i] <= A [i * 2] <= A [i * 2 + 1]". Und Sie können es sicher zum Sortieren verwenden. Die 'Iterator'-Methoden' hasNext() 'und' next() 'sind nicht optional. Zu viel Verwirrung hier. – EJP

Verwandte Themen