2009-11-25 4 views
5

Рассказ, я реализую график, и теперь я работаю над Kruskal, мне нужна очередь приоритетов. Мое определение очереди с приоритетом заключается в том, что первый элемент будет первым? Это неправильно? Потому что, когда я вставляю взвешенные ребра (или числа) в очередь, они не сортируются.Как должна работать очередь приоритетов Java?

PriorityQueue<Integer> tja = new PriorityQueue<Integer>(); 
tja.add(55); 
tja.add(99); 
tja.add(1); 
tja.add(102); 
tja.add(54); 
tja.add(51); 
System.out.println(tja); 

Это напечатало бы это; [1, 54, 51, 102, 99, 55]. Это не отсортировано, как я хочу, чтобы они были! И да, я сделал компилятор, который входит в очередь приоритетов, которая извлекает число из краевого объекта и сравнивается на основе этого int. Так что это должно сработать, или я просто полностью не понял всю концепцию того, как эта структура данных работает?

+0

Чтобы получить отсортированный макет, вы должны использовать 'while (! Tja.isEmpty()) { System.out.println (tja.poll()); } ' – serhii

ответ

16

System.out.println вызывает метод toString(), который использует итератор, который не гарантирует уважения к естественному упорядочению. Из docs: «Итератору, предоставленному в методе итератора(), не гарантируется пересечение элементов очереди приоритетов в любом конкретном порядке».

+0

Итак, есть ли возможность распечатать очередь приоритетов? –

+0

Ничего, нет никакого способа сделать это ... Я обновлю ответ, если вы позволите мне. –

6

У меня нет опыта работы с PriorityQueue в Java, но это выглядит как приоритет вещь не интегрирована в iterator() или toString() (который использует iterator()).

Если вы:

while (tja.size()>0) 
     System.out.println(tja.remove()); 

Вы получаете правильные результаты.

+0

Отлично, поэтому структура не сортируется должным образом, пока вы не запустите удаление. – Algific

+1

Нет, структура всегда правильно сортируется, просто нет, когда вы повторяете ее. Но если вы вызываете poll() или peek() или remove(), вы получаете элементы в правильном порядке. – omerkudat

+0

@data_hepp № Удалить не сортирует структуру. Структура уже отсортирована, но toString() или iterator(), которые она использует внутри, не гарантирует порядок обхода. – Varun

1

Ты знаешь ли функционирование Binary heaps? Если нет, пройдите через минимальную кучу и максимальную структуру кучи. PriorityQueue реализуется на кучи. PriorityQueue не сортирует элементы в порядке возрастания, но на нем выполняется сортировка кучи.

Перейти по ссылке: Priority Queue

Выход вы получаете правильно.

Смежные вопросы