【问题标题】:Max-priority Queue in the Java's standard Collections. Is there one?Java 标准集合中的最大优先级队列。有吗?
【发布时间】:2012-01-21 11:13:47
【问题描述】:

我需要一个Max-Priority Queue 数据结构。

查看Java 的Priority Queue,我注意到它是Min-Priority Queue

来自 javadoc:

这个队列的头是相对于 指定顺序

我看到有提供自定义Comparator 的选项,并且查看了一些帖子,有些人建议使用一个并进行反向比较以获得Max Priority Queue 的结果。
在我看来,这虽然是一种“丑陋的黑客”,而且可能并不直观。

这是从 Java 标准集合中获得 Max-Priority Queue 的唯一方法吗?
我错过了更合适的对象吗? (例如,不久前我没有意识到 StackDeque 取代...我的错)

【问题讨论】:

    标签: java collections queue priority-queue


    【解决方案1】:

    AFAIK,是的,这是获得您想要的东西的最佳方式。我真的不明白这是一个丑陋的黑客。如果只有一个就足够了,那么提供两个不同的类是没有意义的。如果我们按照您的推理,我们将有一个 MinTreeSet 和一个 MaxTreeSet、一个 MinTreeMap 和一个 MaxTreeMap 等,它们都在做完全相同的事情。这是策略模式的经典用法。

    只需使用Collections.reverseOrder() 即可获得一个比较器,该比较器以与自然顺序相反的顺序进行比较。

    【讨论】:

    • (+1) Collections.reverseOrder()
    • 从 javadoc 明确提到它作为优先级队列的角度来看,我认为它是一个丑陋的 hack。他们没有说,顺序可以颠倒并通过适当的比较器。但是您对策略的评论是有道理的,所以 +1。只是我认为 javadoc 并不清楚这一点
    • @user384706:优先级可以是任何东西。降序优先级与升序优先级一样有效。不要将其视为反向最小优先级,将其视为最大优先级,比较器直接指定它。
    • 好吧,javadoc 的第二句说:优先级队列的元素按照它们的自然顺序排序,或者由队列构建时提供的 Comparator 排序。我不认为它可以更清楚。
    【解决方案2】:

    它不是最小堆。您误解了这部分:

    这个队列的头是相对于 指定的顺序。

    重点是指定的排序。这可以是任何东西,包括降序比较。提供你自己的比较器是它应该被使用的方式,它绝对不是一个“丑陋的黑客”。

    就在开头:

    此队列根据指定的顺序对元素进行排序 施工时间,根据他们的规定 自然顺序(参见 Comparable),或根据 Comparator, 取决于使用的构造函数。

    这清楚地表明提供您自己的比较器是预期的行为。

    【讨论】:

    • 好的,指定排序但元素最少。
    • @user384706:这里的最少在数字意义上并不是最不重要的,在 { 3, 1, 2 } 中,1 是最少的。根据指定的比较,它在某种意义上是“最低优先级”。
    • @Tudor:我看不出这和我的解释有什么不同。我的意思是它是最少的
    • 是的,最低优先级。如果您提供降序比较器,则最大值的优先级最低,即使在数值上它是最大值。
    • 这对于集合 API 来说是全局性的:只要比较器适用,您就必须习惯“最不符合”或“最不符合”的概念。它具有特定、明确、有用的含义。
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 2022-11-15
    相关资源
    最近更新 更多