如何配置Java优先级队列以忽略重复项?

2022-09-02 01:04:36

我认为add()应该忽略重复项,但我的输出有重复项。如何不存储重复项?

我还想知道优先级队列如何检查两个元素是否重复。我猜它使用的是比较器等于,但我只想确定。

谢谢


答案 1

以下是PriorityQueue Javadoc的一部分:

此队列根据构造时指定的顺序对元素进行排序,该顺序根据其自然顺序(请参阅可比较)或根据比较器指定,具体取决于使用的构造函数。

所以是的,PriorityQueue使用Compolarator(如果您将其指定为构造函数参数)或使用compareTo(...)方法(元素必须实现Compable接口)。

优先级队列允许重复项。因此,如果您想避免这种情况,则需要实现自己的队列版本。你可以找到非常优雅的方法,如何在“有效的Java”中做到这一点,第85页。或者,您可以扩展PriorityQueue类并重写add方法(这是放置包含(...)检查的理想场所)。


答案 2

Java 中的 A 对重复元素没有任何限制。如果要确保优先级队列中永远不会同时存在两个相同的项目,最简单的方法是与优先级队列并行维护一个单独的项目。每次要将元素插入优先级队列时,都可以检查该集合是否已经包含它,如果没有,则将其添加到集合和优先级队列中。每当您从优先级队列中删除元素时,只需从集合中删除该元素即可。PriorityQueueSet

或者,根据您打算对优先级队列执行的操作,以及在这种情况下如何定义相等性,将其替换为单个操作可能是可行的,因为这仍将允许您执行在优先级队列中有权访问的所有重要操作,同时它不允许重复。TreeSet