[英]Attempting to override existing comparator for PriorityQueue in Java
因此,我尝试使用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,因为您只能比较此变量和另一个变量,并且不能将两个单独的变量传递给类。 实施比较器可以解决该问题。
导入java.util。*;
public class Hello implements Comparator<Adjacency>{
@Override
public int compare(Adjacency o1, Adjacency o2) {
return Double.compare(o1.weight, o2.weight);
}
}
那不是您应该怎么做。 不要将PriorityQueue
子类化。 最简单的方法是在Ajacency
类中实现Comparable<Adjacency>
。
在您的情况下,可能如下所示:
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);
}
}
PriorityQueue
具有一个支持重写其默认Comparator
的构造函数。
这意味着您必须为队列提供初始容量,而且还可以制作自己想要的自定义比较器,而无需修改或触摸PriorityQueue
的实现。
除非您具有将Adjacency
类设为Comparable
,否则根本不需要在Adjacency
上实现Comparable
。
编辑:由于您已经引起我们注意,您无法真正修改Adjacency
类,因此使用自定义Comparator
可能是正确的选择。
这是一个例子。 您应该检查null
; 下面的代码段仅用于说明目的。
Comparator<Adjacency> adjacencyComparator = new Comparator<Adjacency>() {
@Override
public int compare(Adjacency left, Adjacency right) {
return left.weight.compareTo(right.weight);
}
};
您可以使用以下方法覆盖优先级队列比较器:
PriorityQueue<Adjacency>priorityQueue=new PriorityQueue<>(new Comparator<Adjacency>() {
@Override
public int compare(Adjacency adjacency, Adjacency t1) {
return 0;
}
});
只需根据需要更改比较样式...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.