1

我正在尝试按升序排列整数对,其中如果两个条目都严格小于另一对的条目,则认为一对小于另一对,如果两个条目都严格大于另一对的条目,则大于另一对一对。所有其他情况都被认为是无法比拟的。

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

谢谢

4

1 回答 1

1

如果您查看PriorityQueue源代码,则在添加/提供新元素时.compare()调用该方法而无需任何 try/catch(这是在 中siftUpUsingComparator()) - 这是有道理的,因为 PriorityQueue 没有责任阻止您将无法比较的元素放入队列中。因此,您的 Comparator 抛出的任何 RuntimeException 都会冒泡到您的调用代码中。

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

于 2010-04-09T11:10:30.817 回答