PriorityQueue add方法在执行时抛出类强制转换异常(MyVertex无法强制转换为java.lang.Comparable)。
正确插入了MyVertex类型的某些对象,并且某些抛出异常,无法找到它们之间的差异。
请参阅Java中附带的代码行:
PriorityQueue<Vertex> pq = new PriorityQueue<>();
for (Edge edge : vertex.getEdges()) {
pq.add(edge.getTo());
}
预期:方法pq.add()不应引发异常。
答案 0 :(得分:1)
实现Comparable
接口,并在ComapareTo
类内重写Vertex
以满足优先级队列的顺序。
如Java文档所说-add
如果无法根据优先级队列的顺序将指定的元素与当前在此优先级队列中的元素进行比较,则抛出ClassCastException。
正如您之前说过的那样,这是因为当priorityQueues的大小为0(添加第一个元素时)时,add调用不会引发ClassCastException。为了进行测试,请在调用for循环之前打印vertex.getEdges().size()
的大小。如果大小看起来大于0,则将抛出ClassCastException
。
当大小不为零时,将调用筛选操作,因为优先级队列中的基础data_structure是一个堆。
您看到的异常是由sift-up
触发的,因为内部进行筛选需要您的元素实现Comparable
。当优先级队列大小不为0或添加了后续元素时,将调用sift-up
。
注意:
堆应满足heap属性:如果P是C的父节点, 则P的键(值)大于或等于(in 最大堆)或小于(等于最小堆)C键。
筛选:根据需要在树中上移节点;过去 插入后恢复堆条件。之所以称为“筛选”,是因为节点 像筛子一样向上移动树直到达到正确的水平。