PriorityQueue не сортировка по добавлению
У меня есть очередь приоритетов, в которую я добавляю объект 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));
}
Вот метод Node 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;
}
Ответы
Ответ 1
Думаю, вы ожидаете, что PriorityQueue
вернет элементы в определенном порядке, когда вы его итерации. Тем не менее, PriorityQueue
не обеспечивает такого поведения, поскольку оно реализовано как куча приоритета, а не отсортированный список. Из javadoc:
Итератор, предоставляемый в методе итератора(), не гарантирует пересечения элементов очереди приоритетов в любом конкретном порядке. Если вам нужно упорядоченное обход, подумайте об использовании массива Arrays.sort(pq.toArray()).
Единственная гарантия, предоставляемая PriorityQueue
, заключается в том, что poll()
, peek()
и т.д. возвращают наименьший элемент. Если вам нужна упорядоченная итерация элементов, используйте другую коллекцию, например TreeSet
.