PriorityQueue 排序但最大的两个

PriorityQueue sorted but the two biggest

public class Pair implements Comparable<Pair>{
    public String name;
    public int number;

    public int compareTo(Pair other) {
        if (other == null) {
            return 1;
        }
        return Integer.compare(number, other.number);
    }
}
ht = new Hashtable<String, Pair>(perLen);
PriorityQueue<Pair> pq = new PriorityQueue<Pair>(k);
set = ht.keySet();
for (String i: set) {
        tmp0 = ht.get(i);
        if (tmp0.compareTo(pq.peek()) > 0) {
            if (pq.size() == k) {
                pq.remove();
            }
            pq.add(tmp0);
        }
}
System.out.println(pq.toString());

输出:

[OSCAR 822, ALBERTO 827, DAVID 1523, JAVIER 943]

我正在哈希表中寻找最大的 k 对(它们的编号),而输出中的那些实际上是正确的。我的问题是,为什么最后两个交换了?

您可以使用 poll 方法检查顺序,如下所示:

Print content of priority queue[java]

PriorityQueue 的 toString() 方法 class 不能保证元素的顺序,因为它使用迭代器。

PriorityQueue 仅 returns 从其头部算起的最低元素。它不会对所有元素进行排序,因此如果您使用 pq.toString() 遍历队列,元素可能不会按顺序出现。发生这种情况是因为在内部,PriorityQueue.toString() 使用 PriorityQueue.iterator() 方法,并且根据文档:

The Iterator provided in method iterator() is not guaranteed to traverse the elements of the priority queue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).

如果你想按顺序打印优先队列的元素,你应该更改此代码:

System.out.println(pq.toString());

以下内容:

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