2012-12-02 26 views
1

我正在嘗試爲鄰接矩陣實現Dijkstra的算法,並且我正在使用Java優先級隊列來執行此操作。 對於我的頂點我創建一個自定義的比較器類,但我收到以下錯誤:使用自定義比較器類的錯誤

<anonymous Dijkstra$1> is not abstract and does not override abstract method compare(vertex,vertex) in java.util.Comparator 
     PriorityQueue<vertex> Q = new PriorityQueue<vertex>(n,new Comparator<vertex>() {   

這裏是代碼:

import java.util.Scanner; 
import java.io.File; 
import java.util.PriorityQueue; 
import java.util.Comparator; 
class vertex { 
    int v,d; 
    public vertex(int num,int dis){ 
     v =num; 
     d=dis; 
    } 
    public int getv(){ 
     return v; 
    } 
    public int getd(){ 
     return d; 
    } 
} 

,然後我用它來創建一個新的優先級隊列:

PriorityQueue<vertex> Q = new PriorityQueue<vertex>(n,new Comparator<vertex>() {   
      public int compare (Object a, Object b){ 
      vertex v1 = (vertex)a; 
      vertex v2 = (vertex)b; 
      if (v1.getd() > v2.getd()){ 
       return +1; 
      }else if (v1.getd() < v2.getd()){ 
       return -1; 
      }else { 
       return 0; 
      } 
     }}); 
+2

如果你使用的'比較',然後比較方法簽名是:'公衆詮釋比較(頂點a,頂點b);而且,將比較方法編寫爲:'return a.getd() - b.getd();' –

+1

'a.getd() - b.getd( )'會因爲溢出而返回非常大的值的錯誤結果。 –

+0

@JB Nizet - ofcourse ...我並不總是小心翼翼,但一個好的做法是在處理大數字時除以2:'return a.getd()/ 2 - b.getd()/ 2; ''或者使用BigInteger這樣的類 –

回答

0

您正在收到的錯誤是因爲您沒有執行正確的方法。 Comparator<vertex>compare方法的簽名是public int compare (vertex a, vertex b);而不是public int compare (Object a, Object b);

而且,作爲JB Nizer明智地指出,這將是更好地執行你的比較方法如下:

public int compare (vertex a, vertex b) { 
    return Integer.compare(a.getd(), b.getd()); 
}