[英]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.