如何使用类在Java中对PriorityQueue进行排序[重复]

Posted

技术标签:

【中文标题】如何使用类在Java中对PriorityQueue进行排序[重复]【英文标题】:How to Sort PriorityQueue in Java with class [duplicate] 【发布时间】:2021-07-25 01:43:31 【问题描述】:

我知道关于这个问题有很多答案。我尝试关注它,但它不会显示我想要的结果。 有一个 输入 60 3 50 2 20 1 40 2 30 3 30 1

我期待 输出 60 3 50 2 40 2 30 3 30 1 20 1 但如果我打印priorityQueue,它将显示

60 3 50 2 40 2 20 1 30 3 30 1

我不知道为什么..

这是我下面的代码

import java.util.*;

public class MaximumIncomeSchedule 
    static class Schedule  
        int income;
        int date;

        public Schedule(int i, int d) 
            income = i;
            date = d;
        
       
    
    public static void main(String[] args) throws Exception 
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        PriorityQueue<Schedule> pq = new PriorityQueue<>(n,(o1, o2) -> 
            if(o2.income==o1.income)
                return o2.date - o1.date;
            return o2.income - o1.income;
        );
        int mD = 0;
        for (int i = 0; i < n; i++) 
            int M = sc.nextInt();
            int D = sc.nextInt();
            Schedule s = new Schedule(M, D);
            pq.add(s);
            mD = Math.max(mD, D);
        
        for (Schedule s : pq) 
            System.out.println("income:" + s.income + " " + "time: " + s.date);
        
    

【问题讨论】:

PriorityQueue 类使用堆作为其实现。堆不知道其元素的总顺序,只知道 next 元素是什么。迭代队列不能按顺序给出元素(巧合除外)。按顺序获取元素的唯一方法是重复轮询队列。 谢谢kriegaex!我想我错过了重要的一点!!帮助很大 【参考方案1】:

您的比较器 lambda 是正确的,您可以按原样使用它。您只需要轮询队列即可以正确的顺序获取元素:

    while (!pq.isEmpty()) 
      Schedule s = pq.poll();
      System.out.println("income:" + s.income + " " + "time: " + s.date);
    

【讨论】:

对不起,我刚刚注意到@Unmitigated 发布后的评论并点击了链接。链接问题的答案与我的基本相同。我将投票结束这个问题作为重复。这里是关于迭代,而不是关于toString(),但它是关于解决方案的重复。

以上是关于如何使用类在Java中对PriorityQueue进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java 中的比较器和 PriorityQueue 是如何工作的?

死磕 java集合之PriorityQueue源码分析

Java使用二叉堆创建HeapPriorityQueue来实现PriorityQueue

在 java 中实现 PriorityQueue 的最佳方法是啥?

java PriorityQueue优先级队列使用

Java - PriorityQueue