簡體   English   中英

嘗試覆蓋Java中PriorityQueue的現有比較器

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM