【问题标题】:how to implement an ordered but not sorted priorityqueue in java? [duplicate]java - 如何在java中实现有序但未排序的priorityqueue? [复制]
【发布时间】:2014-12-03 19:44:07
【问题描述】:

我按照here 中的示例创建PriorityQueue。它工作得很好,我能够优先考虑我的对象。但我的问题是我的理解,Queue 是先进先出。所以假设我创建一个PriorityQueue 并按优先级对其进行排序。我首先将一个对象添加到优先级=Low 和值=c 的队列中。然后我将另一个对象添加到我的PriorityQueue,优先级设置为高,值设置为 b。最后我想向PriorityQueue 添加另一个具有高优先级但值=a 的对象。然后我用poll() 打印出我得到的这三个对象

priority: High, value: a
priority: High, value: b
priority: Low, value: c

优先级排序正确,但我希望具有相同优先级的两个对象遵循先进先出规则。因为 b 先加在 a 之前,所以预期的结果应该是

priority: High, value: b
priority: High, value: a
priority: Low, value: c

这可行吗?我的比较器如下

private static Comparator<Request> comparator = new Comparator<Request>(){
    @Override
    public int compare(Request r1, Request r2) {
        return (int) (r1.priority - r2.priority);
    }
};

谢谢!

【问题讨论】:

    标签: java priority-queue


    【解决方案1】:

    你做不到。来自PriorityQueue docs

    这个队列的头部是相对于指定顺序的最小元素。 如果多个元素以最低价值绑定,则头部是这些元素之一——绑定被任意打破。 (添加了重点)

    您可以做的是为每个 Request 分配一个唯一的、递增的 ID,然后在比较器中使用它来打破同等优先级实例之间的联系。

    【讨论】:

    • 得到它!感谢您的快速帮助
    猜你喜欢
    • 2013-07-15
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    相关资源
    最近更新 更多