2013-02-26 4 views
5

w Javie, nie wiem, jak utworzyć nowy PriorityQueue z nowym komparatorem, ale bez podania długości kolejki? Jak mogę to zrobić?Jak utworzyć PriorityQueue z nowym komparatorem i BRAK określonej początkowej pojemności?

wiem, że mogę napisać:

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

Ale mam nadzieję, że kolejka może działa jak LinkedList, to znaczy jego długość nie jest ustalona, ​​jak mogę oświadczyć, prawda?

Odpowiedz

7

Nie ma takiego konstruktora. Jak na Javadocs, the default capacity is 11, więc można określić, że do analogicznego zachowania do nie-Arg PriorityQueue konstruktora:

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

i tak, the queue will grow if it needs to.

Kolejka priorytetem jest nieograniczona, ale ma wewnętrzny pojemność określająca rozmiar tablicy używanej do przechowywania elementów w kolejce. Jest zawsze co najmniej tak duży, jak rozmiar kolejki. Gdy elementy są dodawane do kolejki priorytetów, ich pojemność rośnie automatycznie. Szczegóły polityki wzrostu nie są określone.

+0

Rozumiem. I jeszcze jedno pytanie: jeśli chcę wykonać lokalne wyszukiwanie belek, muszę ograniczyć PriorityQueue do numeru poprawki (na przykład: 10), jak mogę naprawić długość PriorityQueue? – lkkeepmoving

+0

Użyj ograniczonej wielkości ['LinkedBlockingQueue'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html). –

+0

Ale klasa LinkedBlockingQueue działa inaczej niż PriorityQueue, prawda? Czy kolejka ma funkcję zarówno LinkedBlockingQueue, jak i PriorityQueue? – lkkeepmoving

1

Obawiam się, że nie można podać tylko Comparator bez określania początkowej pojemności. Należy zauważyć, że jest to tylko pojemność początkowa - kolejka może wzrosnąć z tej wartości początkowej.

1

Począwszy od Java wersji 8 nowe konstruktor, który może robić co prosisz: kolejka priorytetowa (komparatora porównującego)

Więc dostaniesz:

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

Z dokumentu: 'Tworzy PriorityQueue z domyślną początkową pojemnością i którego elementy są sortowane zgodnie z określonym komparatorem." Więc wciąż 11 xD – Enissay

0

Można utworzyć priorytet kolejki z siebie -defined komparator bez ustalania rozmiaru za pomocą Java lambda funkcję w Java SE 8.

na przykład, można zrobić:

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

Zobacz przykład o Lambda: https://www.mkyong.com/java8/java-8-lambda-comparator-example/

Powiązane problemy