当前位置: 首页 > 知识库问答 >
问题:

PriorityQueue已排序但最大的两个[重复]

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

共有3个答案

焦信鸥
2023-03-14

您可以使用轮询方法检查订单,如下所示:

打印优先级队列的内容[java]

狄易安
2023-03-14

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

郎健柏
2023-03-14

PriorityQueue仅返回其头部的最低元素。它不会对所有元素进行排序,因此如果使用pq遍历队列。toString(),元素可能没有按顺序显示。这是因为在内部,PriorityQueue。toString()使用优先级队列。迭代器()方法,根据文档:

方法Iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用<代码>数组。排序(pq.toArray())。

如果要按顺序打印优先级队列的元素,应更改以下代码:

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

对下列事项:

while (!pq.isEmpty()) 
    System.out.println(pq.remove());
 类似资料:
  • 假设列表“A”是1- 请回顾一下这个,帮我即兴创作

  • 问题内容: 哪个实现不太“繁重”:PriorityQueue或排序的LinkedList(使用Comparator)? 我想对所有项目进行排序。插入将非常频繁,有时我将必须运行所有列表以进行一些操作。 问题答案: A 是最糟糕的选择。要么使用(或更一般地说,是一个实现者),要么。如果确实使用列表,则仅在遍历列表内容之前对其进行排序,而不是在每次插入之后对其进行排序。 有一点要注意的是,迭代器 不

  • 可能重复: Java两个字段排序问题 我有用户对象,比如 我有一个,其中包含这些对象,我必须按名字对其进行排序,如果名字匹配,则只按姓氏排序。

  • 我实现了最大的三重乘积算法,但我使用了排序,这使得我的时间复杂度为O(nlogn)。有没有办法在没有临时排序数组的情况下实现它? 问题:给定一个由n个整数组成的列表arr[0...(n-1)]。您必须计算一个列表输出[0...(n-1)],以便对于每个索引i(在0和n-1之间,包括在内),输出[i]等于arr[0... i]中三个最大元素的乘积(如果i 示例: 我的解决方案: 谢啦

  • 我关注的是从包含数千个元素的Java PriorityQueue创建排序数组的不同风格。Java8文档说 如果需要有序遍历,请考虑使用数组。排序(pq.toArray())。 然而,我确实喜欢流式API,所以我最初的想法是 (其中,是PriorityQueue的自定义比较器,我确实想要它的相反顺序。)与下列习惯用法相比,使用这个习惯用法有什么缺点吗 后面的代码显然更直接地遵循了API文档的建议,但

  • 我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,从左到右插入到一个空堆中。生成的堆是什么?