获取ClassCastException。需要帮忙 信息:Vertex是一个用户定义的类,它有一个Edge类对象的链接列表。
这是我的代码:
private void reachable() {
clearAll();
for (Vertex v : vertexMap.values())
v.setColor("white");
for (Vertex s : vertexMap.values())
if (s.isStatus())
bfs(s);
}
private void bfs(Vertex s) {
s.setColor("gray");
s.dist = 0;
s.prev = null;
Queue<Vertex> vertices = new PriorityQueue<Vertex>();
vertices.add(s);
while (!vertices.isEmpty()) {
Vertex u = vertices.remove();
for (Iterator i = u.adjacent.iterator(); i.hasNext();) {
Edge edge = (Edge) i.next();
Vertex adj = edge.getDestVertex();
if (!adj.getName().equals(u.getName()) && adj.isStatus())
if (adj.getColor().equals("white")) {
adj.setColor("gray");
adj.dist = u.dist + 1;
adj.prev = u;
vertices.add(adj);
}
}
u.setColor("black");
}
}
答案 0 :(得分:1)
我猜这个问题就在这里:
Queue<Vertex> vertices = new PriorityQueue<Vertex>();
vertices.add(s); // <<<---- HERE
PriorityQueue
需要能够比较参数类型的实例(即Vertex
)以确定它们的相对优先级。如果使用Comparator<Vertex>
对象作为参数实例化队列,则队列将使用该队列来确定优先级。否则,它希望Vertex
实现Comparable<Vertex>
。
发生异常是因为在add
操作中,代码正在尝试将Vertex
个对象转换为Comparable
。
解决方案:
将类声明为... class Vertex implements Comparable<Vertex>
并提供int compareTo(Vertex)
方法的实现。
实现Comparator<Vertex>
类,其实现为int compare(Vertex, Vertex)
,并将实例传递给PriorityQueue
构造函数。 (您可以使用匿名类。)
无论哪种方式,compare / compareTo方法都是队列优先级的基础。相应地实施它。