PriorityQueue не сортируется по добавлению - PullRequest
23 голосов
/ 17 апреля 2011

У меня есть очередь с приоритетами, в которую я добавляю объект Node, где узлы должны быть отсортированы по значению, которое они содержат. По какой-то причине приоритетная очередь не будет сортировать узлы при добавлении. Если кто-то может увидеть что-то не так с этим или у него есть какие-либо рекомендации, я ценю это. Вот краткий пример:

PriorityQueue<Node> PQ = new PriorityQueue<Node>();
        //for each entry create a node and add it to the PriorityQueue
        for(Entry<Character,Integer> entry : entries){
            PQ.add(new Node(entry.getKey(),entry.getValue(), true));
        }

вот метод узла compareTo:

@Override
public int compareTo(Node n) {
  if(n.frequency.intValue() > this.frequency.intValue()) return  -1;
  else if(n.frequency.intValue() == this.frequency.intValue()) return 0;
  else return 1;
}

Ответы [ 2 ]

44 голосов
/ 17 апреля 2011

Полагаю, вы ожидаете, что PriorityQueue будет возвращать элементы в определенном порядке, когда вы итерируете его. Однако PriorityQueue не обеспечивает такого поведения, потому что он реализован как куча приоритетов, а не как отсортированный список. От Javadoc :

Итератор, предоставленный в методе iterator (), не гарантирует прохождение элементов очереди с приоритетами в любом конкретном порядке. Если вам нужен упорядоченный обход, рассмотрите возможность использования Arrays.sort (pq.toArray ()).

Единственная гарантия, предоставляемая PriorityQueue, заключается в том, что poll(), peek() и т. Д. Возвращают наименьший элемент. Если вам нужна упорядоченная итерация элементов, используйте другую коллекцию, например TreeSet.

2 голосов
/ 12 марта 2018

Кто ищет, как выполнить итерацию очереди в следующем порядке, это можно сделать с помощью poll или remove .

while (!queue.isEmpty())
    System.out.println(queue.poll());

while (!queue.isEmpty())
    System.out.println(queue.remove());

Единственная разница между poll() и remove() состоит в том, что опрос возвращает ноль, когда он пуст, и удаляет бросает NoSuchElementException.

...