如何使用类在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使用二叉堆创建HeapPriorityQueue来实现PriorityQueue