如果两个条目的条目严格小于另一个条目,并且如果它们的两个条目都严格地大于另一个条目,那么我正在尝试一对整数的顺序对,其中一对被认为小于另一对。另一对。所有其他案件都被认为是无法比拟的。
我想解决这个问题的方法是定义实现上述内容的Comparator
,但会为无法比较的案例抛出异常,并将其提供给PriorityQueue
。当然,在插入一对时,优先级队列会进行多次比较,同时将新条目冒泡到堆中的正确位置,其中许多将具有可比性。但是在冒泡过程中可能会遇到一对遇到这对新对无法比较的对,并且会抛出异常。如果发生这种情况,PriorityQueue
的状态是什么?我试图插入的那对是否会在抛出异常之前的最后一个位置坐在堆中?如果我使用PriorityQueue's remove(Object o)
方法,PriorityQueue
是否会恢复到一致状态?
由于
答案 0 :(得分:1)
如果查看PriorityQueue
源代码,在添加/提供新元素时,调用.compare()
方法时不会有任何try / catch(这在siftUpUsingComparator()
中) - 这是有意义的,因为PriorityQueue不负责阻止您将无法比较的元素放入队列中。因此,比较器抛出的任何RuntimeException都会冒泡到您的调用代码。
这里更大的问题是你为什么要按照你的定义对“无与伦比”的物品进行分类?这没有多大意义。如果项目属于同一类型但不大于或小于另一个项目,则比较器应将它们返回为相等。比较器的语义是这样的,“相等”并不意味着“具有相同的值”,而是“具有与被比较的元素相同的顺序” - 换句话说,当你想要两个项目时返回等于(0)在排序中彼此相邻排序。