Java 如果我的比较器在';她忙着上下翻腾?

Java 如果我的比较器在';她忙着上下翻腾?,java,priority-queue,comparator,Java,Priority Queue,Comparator,我尝试对整数对进行升序,其中一对被认为比另一对小,如果它的两个项都严格小于另一对的项,并且如果它的两个项都严格大于另一对的项,则比另一对大。所有其他情况都被认为是无可比拟的 我想要解决这个问题的方法是定义一个比较器,该比较器实现上述功能,但会对不可比较的情况抛出异常,并将其提供给优先级队列。当然,在插入一对时,优先级队列会进行几次比较,同时将新条目冒泡到其在堆中的正确位置,其中许多是可比较的。但是,在冒泡过程中,可能会遇到与此新对不可比较的对,并且会引发异常。如果发生这种情况,PriorityQ

我尝试对整数对进行升序,其中一对被认为比另一对小,如果它的两个项都严格小于另一对的项,并且如果它的两个项都严格大于另一对的项,则比另一对大。所有其他情况都被认为是无可比拟的

我想要解决这个问题的方法是定义一个
比较器
,该比较器实现上述功能,但会对不可比较的情况抛出异常,并将其提供给
优先级队列
。当然,在插入一对时,优先级队列会进行几次比较,同时将新条目冒泡到其在堆中的正确位置,其中许多是可比较的。但是,在冒泡过程中,可能会遇到与此新对不可比较的对,并且会引发异常。如果发生这种情况,
PriorityQueue
的状态是什么?在抛出异常之前,我试图插入的对是否会位于堆中的最后一个位置?如果我使用
PriorityQueue的remove(objecto)
方法,那么
PriorityQueue
是否会恢复到一致状态


感谢如果您查看
PriorityQueue
源代码,在添加/提供新元素时,调用
.compare()
方法时没有任何try/catch(这在
siftUpUsingComparator()
中),这很有意义,因为阻止您将不可比较的元素放入队列不是PriorityQueue的责任。因此,比较器引发的任何RuntimeException都将冒泡到调用代码中


这里更大的问题是,为什么您要尝试对根据您的定义为“不可比较”的项目进行排序?这没有多大意义。如果项目类型相同,但既不大于也不小于另一个项目,则比较器应将其作为相等项返回。Comparator的语义是这样的,“equal”并不意味着“具有相同的值”,而是“与被比较的元素具有相同的顺序”-换句话说,当您希望两个项在排序中相邻排序时,返回equal(0)。

如果您查看
优先级队列
源代码,添加/提供新元素时,调用
.compare()
方法时不使用任何try/catch(这在
siftUpUsingComparator()
中)-这是有意义的,因为优先级队列不负责阻止您将不可比较的元素放入队列。因此,比较器引发的任何RuntimeException都将冒泡到调用代码中


这里更大的问题是,为什么您要尝试对根据您的定义为“不可比较”的项目进行排序?这没有多大意义。如果项目类型相同,但既不大于也不小于另一个项目,则比较器应将其作为相等项返回。Comparator的语义是这样的,“equal”并不意味着“具有相同的值”,而是“具有与被比较的元素相同的顺序”——换句话说,返回equal(0)当您希望两个项目在排序中相邻排序时。

我真正想做的是获得严格增长的最长成对序列。通过抛出异常,我试图取消那些不符合此序列的对。顺便说一句:我尝试了一下,结果堆中出现了一个空元素。也许PriorityQueue不是您想要做的最好的数据结构?我真正想做的是获得严格增长的最长对序列。通过抛出异常,我试图取消那些不符合此序列的对。顺便说一句:我尝试了一下,结果在我的堆中出现了一个空元素。也许PriorityQueue不是你想要做的最好的数据结构?