2013-02-26 4 views
5

in Java, ich weiß nicht, wie man eine neue PriorityQueue mit neuen Komparator aber ohne die Warteschlange Länge? Wie kann ich es erstellen?Wie erstelle ich eine PriorityQueue mit neuem Komparator und keiner angegebenen Anfangskapazität?

Ich weiß, dass ich schreiben kann:

Queue<Node> theQueue = new PriorityQueue<Node>(15,new Comparator<Node>(); 

Aber ich hoffe, dass die Warteschlange können Werke wie LinkedList, ich meine seine Länge nicht festgelegt ist, wie kann ich es erklären?

Antwort

7

Es gibt keinen solchen Konstruktor. Gemäß den JavaDocs, the default capacity is 11, so könnte man das für analoge Verhalten der nicht-arg PriorityQueue Konstruktor angeben:

Queue<Node> theQueue = new PriorityQueue<Node>(11,new Comparator<Node>()); 

Und ja, the queue will grow if it needs to.

Eine Prioritätswarteschlange ist unbegrenzt, aber hat eine interne Kapazität, die die Größe eines Arrays bestimmt, das zum Speichern der Elemente in der Warteschlange verwendet wird. Es ist immer mindestens so groß wie die Größe der Warteschlange. Wenn Elemente zu einer Prioritätswarteschlange hinzugefügt werden, wird ihre Kapazität automatisch erhöht. Die Details der Wachstumsrichtlinie sind nicht angegeben.

+0

Verstanden. Und noch eine Frage: Wenn ich lokale Strahlsuche machen möchte, muss ich die PriorityQueue auf eine feste Zahl beschränken (zum Beispiel: 10), wie kann ich die Länge einer PriorityQueue festlegen? – lkkeepmoving

+0

Verwenden Sie eine size-bounded ['LinkedBlockingQueue'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html). –

+0

Aber die LinkedBlockingQueue-Klasse funktioniert anders als PriorityQueue, oder? Kann eine Warteschlange die Funktion von LinkedBlockingQueue und PriorityQueue haben? – lkkeepmoving

1

Ich fürchte, es gibt keine Möglichkeit, nur eine Comparator ohne Angabe einer Anfangskapazität anzugeben. Beachten Sie, dass dies nur die Anfangskapazität ist - die Warteschlange kann von diesem Anfangswert aus wachsen.

1

ab Java Version 8 gibt es einen neuen Konstruktor, der tun kann, was man sich wünschen: Priorityqueue (Vergleicher Vergleicher)

So würden Sie erhalten:

Queue<Node> theQueue = new PriorityQueue<>(new Comparator<Node>()); 
+0

Aus doc: 'Erstellt eine PriorityQueue mit der Standard-Anfangskapazität und deren Elemente sind nach dem angegebenen Komparator geordnet. So, es ist immer noch 11 xD – Enissay

0

Sie können eine Prioritätswarteschlange mit selbst erstellen -defined Komparator, ohne die Größe Festsetzung von Java Lambda verwenden, eine Funktion in Java SE 8.

Zum Beispiel können Sie tun:

PriorityQueue<String> pq = new PriorityQueue<>((s1, s2) -> s1.compareTo(s2));

Siehe Beispiel über Lambda: https://www.mkyong.com/java8/java-8-lambda-comparator-example/

Verwandte Themen