Java';s的标准收藏。有吗?
我需要一个Java';s的标准收藏。有吗?,java,collections,queue,priority-queue,Java,Collections,Queue,Priority Queue,我需要一个最大优先级队列数据结构 在Java中,我注意到它是一个最小优先级队列 从javadoc: 此队列的头是相对于队列的最小元素 指定顺序 我看到有一个选项可以提供一个定制的比较器,查看一些帖子,一些人建议使用一个比较器并进行反向比较,以获得最大优先级队列的结果 在我看来,这似乎是一个“丑陋的黑客”,也许不是直觉 这是从Java的标准集合获得最大优先级队列的唯一方法吗? 有没有更合适的对象我错过了?(例如,不久前我没有意识到Stack被Deque…我的坏)好的,是的,这是得到你想要的东西的最
最大优先级队列
数据结构
在Java中,我注意到它是一个最小优先级队列
从javadoc:
此队列的头是相对于队列的最小元素
指定顺序
我看到有一个选项可以提供一个定制的比较器
,查看一些帖子,一些人建议使用一个比较器并进行反向比较,以获得最大优先级队列的结果
在我看来,这似乎是一个“丑陋的黑客”,也许不是直觉 这是从Java的标准集合获得
最大优先级队列的唯一方法吗?
有没有更合适的对象我错过了?(例如,不久前我没有意识到Stack
被Deque
…我的坏)好的,是的,这是得到你想要的东西的最好方式。我真的不明白这是一个多么丑陋的黑客行为。如果只提供一个就足够了,那么提供两个不同的类是没有意义的。如果我们按照你的推理,我们会有一个MinTreeSet和一个maxtreeeset,一个MinTreeMap和一个maxtreeemap,等等,它们都在做完全相同的事情。这是战略模式的经典用法
只需使用以与自然顺序相反的顺序进行比较的比较器。它不是最小堆。你误解了这一部分:
此队列的头是相对于队列的最小元素
指定顺序
重点是指定的顺序。这可以是任何东西,包括降序比较。提供您自己的比较器是如何使用的,它绝对不是一个“丑陋的黑客”
一开始:
此队列根据在中指定的顺序对元素进行排序
施工时间,根据其
自然顺序(见可比),或根据比较器,
取决于所使用的构造函数
这清楚地表明,提供您自己的比较器是预期的行为。(+1)对于集合。reverseOrder()
我认为这是一个丑陋的黑客行为,因为javadoc明确提到它是一个优先级队列。他们没有说,可以反转顺序并传递适当的比较器。但是你对战略的评论是有意义的,所以+1。只是我认为这一点从表面上看不清楚javadoc@user384706:优先级可以是任何东西。降序优先级与升序优先级一样有效。不要将其视为反向最小优先级,而应将其视为最大优先级,其中比较器直接指定了这一点。javadoc的第二句话说:优先级队列的元素按照其自然顺序排序,或者由队列构造时提供的比较器排序。我不认为它会更清楚。好的,指定了顺序,但指定了最小元素。@user384706:least在这里不是数字意义上的最小元素,在{3,1,2}中,1是最小的。根据指定的比较,从某种意义上说,它是“最不重要的”。@都铎:我看不出这与我的解释有什么不同。我的意思是,它是最不重要的,最不重要的。如果提供降序比较器,则最大值的优先级最低,即使在数字上它是最大值。这对于collections API来说是全局性的:无论比较器适用于何处,您都必须习惯“根据最小”或“相对于最小”的概念。它有一个具体的、明确的、有用的含义。