我有一个优先级队列,我在其中添加一个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;
}
答案 0 :(得分:43)
我猜你希望PriorityQueue
在迭代时按特定顺序返回元素。但是,PriorityQueue
不提供这样的行为,因为它是作为优先级堆而不是排序列表实现的。来自javadoc:
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。
PriorityQueue
提供的唯一保证是poll()
,peek()
等返回最少元素。如果您需要对元素进行有序迭代,请使用其他集合,例如TreeSet
。
答案 1 :(得分:2)