priorityqueue排序但最大的两个

gwbalxhn  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(314)

这个问题在这里已经有答案了

java的priorityqueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么(5个答案)
priorityqueue.tostring元素顺序错误(4个答案)
如何迭代priorityqueue(9个答案)
打印优先级队列[java]的内容(3个答案)
上个月关门了。

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个最大的对(它们的数目),而输出中的对实际上是正确的。我的问题是,为什么最后两个是交换的?

qq24tv8q

qq24tv8q1#

您可以使用poll方法检查订单,如下所示:
打印优先级队列的内容

luaexgnf

luaexgnf2#

priorityqueue类的tostring()方法不能保证元素的顺序,因为它使用迭代器。

55ooxyrt

55ooxyrt3#

PriorityQueue 只返回头中最低的元素。它不会对所有元素进行排序,因此如果使用 pq.toString() ,元素可能不按顺序出现。这是因为,在内部, PriorityQueue.toString() 使用 PriorityQueue.iterator() 方法和,根据文件:
方法中提供的迭代器 iterator() 不能保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用 Arrays.sort(pq.toArray()) .
如果要按顺序打印优先级队列的元素,应更改以下代码:

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

以下内容:

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

相关问题