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

PriorityQueue与内部比较器类[重复]

景昊焜
2023-03-14

我尝试用降序的内部比较器类实现优先级队列,但是当我打印优先级队列时,我没有得到正确的结果。当我尝试收集相同的比较器代码时。排序以实现列表的排序(使用相同的值)。我得到了正确的结果。你能解释一下吗?

//int[] nums = {50,10, 20, 30, 40};
    public static void TestComparatorcomparemethod(int[] nums){
        PriorityQueue<Integer> pq= new PriorityQueue<>(nums.length,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1,Integer o2){
                int a = (int)o1;
                int b = (int)o2;
                if (a > b)
                    return -1;
                else if (a==b)
                    return 0;
                else
                    return 1;
            }
        });
        for (int node:nums){
            pq.add(node);}
        System.out.println("pq values are " + pq);
}

上述代码的答案是pq值为[50,40,20,10,30]

        List<Integer> al = new ArrayList<>();
        al.add(50);
        al.add(10);
        al.add(20);
        al.add(30);
        al.add(40);
        Collections.sort(al, new Comparator<Integer>(){
            @Override
            public int compare(Integer o1,Integer o2){
                int a = (int)o1;
                int b = (int)o2;
                if (a > b)
                    return -1;
                else if (a==b)
                    return 0;
                else
                    return 1;
            }
        } );
        System.out.println("The arraylist values are: " + al);

以上代码的答案是数组值为:[50,40,30,20,10]

共有2个答案

马凡
2023-03-14

打印优先级队列元素时,使用:

System.out.println("The arraylist values are: " + al);

将要打印的元素的顺序不能保证被排序。这可能是因为优先级队列是使用某种堆数据结构实现的,以实现高效的最小元素查找和插入。因此,当您使用上述代码打印元素时,您将打印堆中未排序的元素。

这并不意味着您的优先级队列不工作。

遍历优先级队列中的元素最有效的方法是使用poll()函数,例如:

pq_elem = pq.poll()
while(pq_elem != Null){
  System.out.println(pq_elem)
  pq_elem.poll()
}
郎星汉
2023-03-14

对于优先级队列,意外顺序[50、40、20、10、30]正常(预期)。因为迭代优先级队列不能保证排序顺序。但是如果您使用peek/poll,您将看到返回了预期值。

从文件中:

这个类及其迭代器实现了集合和迭代器接口的所有可选方法。方法迭代器()中提供的迭代器不能保证以任何特定的顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用rrays.sort(pq.toArray())。

你的比较器代码没问题。如果您确实需要按顺序打印值,请尝试:

 System.out.println("pq values are " + Arrays.sort(pq.toArray());
 类似资料:
  • 我想知道是否可以制作实现比较器接口的非静态内部类。 例如:。 我想使用比较器类非静态,因为我想使用非静态字段“num”并想修改它的值。有非静态比较器内部类可以吗? 附加信息 对于每个对象,我都在计算内部的分数,并进行相应的比较和排序。我需要将这些分数保存在我在comparator内计算的地图中,并希望在外部类中使用该地图进行进一步计算。

  • 在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。

  • 问题内容: 我正在创建一个简单的程序来了解Java Comparator类。我已经按顺序进行了排序,但是现在我想按降序对列表进行排序,但是由于使用了实现的内部类(歌曲是容纳getter和setter方法的歌曲类),在调用该方法时遇到了问题。 这是我的课程,里面包含分类过程等。 这是我的简单课程; 有人可以帮我弄清楚我将在类中调用该方法的地方,因为它无法编译? 问题答案: 编辑2015年7月 由于此

  • 我试图解决以下leetcode问题: 给定一个排序数组,两个整数k和x,查找数组中与x最近的k个元素。结果也应该按升序排序。如果有一个领带,较小的元素总是首选。 示例1:输入:[1,2,3,4,5],k=4,x=3 产出:[1,2,3,4] 示例2:输入:[1,2,3,4,5],k=4,x=-1 产出:[1,2,3,4] 目前我的错误解决方案如下: 问题在于我传递给构造函数的比较器。其思想是,我希

  • 我正在将边添加到PriorityQueue,但由于某些原因,它们没有按其值进行排序,从而导致以后出现错误的结果。 我的边缘班是这样的 然而,当我运行我的代码,在属于节点“Springfield,MO”的LinkedList中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么? 我尝试为Edge创建一个特定的比较器类,并将其用作PriorityQueue中的参数

  • 我指的是这个博客上列出的代码:https://strstr.io/Leetcode1054-Distant-Barcodes/ 我在这里复制这段代码 我试图理解的代码在这里 我从这段代码中得到的是是用