所以我试图使用java中的优先级队列数据结构来实现Dijkstra的算法。我唯一需要修改的是类似的运算符,因为java无法比较Adjacency类型的两个变量(用户定义)。我想使用PriorityQueue数据结构,我想要做的就是修改compareTo运算符,以便它可以比较Adjacency类型的两个变量。截至目前,我得到的错误是“类型PriorityQueue必须实现继承的抽象方法Comparable.compareTo(Adjacency)”。当我尝试在compareTo运算符上方添加“@override”标记时,我收到错误“覆盖无法解析为类型”。
public class Adjacency {
public int vertex;
public double weight;
public Adjacency(int v, double w) {
vertex = v;
weight = w;
}
}
public class PriorityQueue<T extends PriorityQueue<T>> implements Comparable<Adjacency> {
public int compareTo(Adjacency o1, Adjacency o2) {
return Double.compare(o1.weight, o2.weight);
}
}
编辑:这是实现Comparator的Hello类。我犯的错误是使用Comparable,因为你只能比较这个和另一个变量,并且不能将两个单独的变量传递给类。实现Comparator解决了这个问题。
import java.util。*;
public class Hello implements Comparator<Adjacency>{
@Override
public int compare(Adjacency o1, Adjacency o2) {
return Double.compare(o1.weight, o2.weight);
}
}
答案 0 :(得分:3)
这不是你应该怎么做的。不要将PriorityQueue
作为子类。
最简单的方法是在Comparable<Adjacency>
课程中实施Ajacency
。
在你的情况下,这可能是这样的:
public class Adjacency implements Comparable<Adjacency> {
public int vertex;
public double weight;
public Adjacency(int v, double w) {
vertex = v;
weight = w;
}
@Override
public int compareTo(Adjacency other) {
return Double.compare(this.weight, other.weight);
}
}
答案 1 :(得分:2)
PriorityQueue
有一个构造函数that supports overriding its default Comparator
。
这意味着您必须为队列提供初始容量,但您也可以制作自己的自定义比较器,这是您想要的,而无需修改或触及{{1 }}
除非您授权PriorityQueue
课程为Adjacency
,否则您无需在Comparable
上实施Comparable
。
编辑:由于您已经注意到您无法真正修改Adjacency
类,因此使用自定义Adjacency
可能是正确的选择。
这是一个例子。您应检查Comparator
;下面的代码段仅用于说明目的。
null
答案 2 :(得分:1)
您可以使用以下方法覆盖Priority Queue Comparator:
PriorityQueue<Adjacency>priorityQueue=new PriorityQueue<>(new Comparator<Adjacency>() {
@Override
public int compare(Adjacency adjacency, Adjacency t1) {
return 0;
}
});
只需根据需要更改比较样式......