2011-04-17 78 views
16

我有一个优先级队列中,我节点对象添加到,其中节点应该由一个值,它们包含进行排序。出于某种原因,优先级队列不会对添加的节点进行排序。如果任何人都可以看到有问题或有任何指导,我很感激。下面是一个简单的例子:PriorityQueue中未排序上添加

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; 
} 

回答

34

我想你想到PriorityQueue当你迭代它返回的特定顺序的元素。但是,PriorityQueue不提供这样的行为,因为它是作为优先堆而不是排序列表实现的。从javadoc

方法iterator()中提供的Iterator不保证以任何特定顺序遍历优先级队列的元素。如果您需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。

PriorityQueue提供的唯一保证就是poll()peek()等返回的最小元素。如果您需要对元素进行有序迭代,请使用其他一些集合,例如TreeSet

+0

权,但我希望它是在去除使用remove()方法 – 2011-04-17 17:30:38

+0

@Trevor每个对象的分类:您还没有表现出迭代码。请更新您的问题以显示一个节目,但*完整的例子,我们可以编译并运行。 – 2011-04-17 17:31:49

+0

没关系,我现在意识到在remove()上对象被排序。感谢所有 – 2011-04-17 17:35:17