2015-11-04 239 views
0

我正在嘗試在java中爲最小生成樹實現Kruskal算法。我正在努力解決類型不兼容問題。在整個計劃中,我有幾個for循環看起來像這樣:Java中的類型兼容性問題

for (Edge f : G.edges()) { 
      int x = f.either(), y = f.other(x); 
      if (!uf.connected(x, y)) { 
       if (f.weight() < e.weight()) { 
        System.err.println("Edge " + f + " violates cut optimality conditions"); 
        return false; 
       } 
      } 
     } 

所有的for循環我有類似於此與爲既可以採用具有

Edge f : G.edges() 

Edge e : G.edges() 
圓括號內爲

。在這種情況下,邊緣是項目Edge.java內另一個類,和邊緣是這樣的類中的一個方法:

for (Edge e : edges()) { 

     // all edges in MST except e 
     uf = new UF(G.V()); 
     for (Edge f : mst) { 
      int x = f.either(), y = f.other(x); 
      if (f != e) uf.union(x, y); 
     } 

當該代碼被放入NetBeans中,含有該for循環產生一個錯誤類型的線, 「不兼容的類型:com.sun.javafx.geom.Edge不能轉換爲kruskal.Edge」NetBeans建議通過將f和e變量的類型更改爲邊來解決此問題。這樣做會使我的代碼看起來像這樣:

for (com.sun.javafx.geom.Edge e : G.edges()) { 
     int v = e.either(), w = e.other(v); 
     if (!uf.connected(v, w)) { 
      System.err.println("Not a spanning forest"); 
      return false; 
     } 
    } 

這個解決方案的唯一的問題是,當我實現它,它沒有認識到在我的邊緣實現我的是()和其他()方法。 java文件。這裏是我的其他()方法的示例:

public int other(int vertex) { 
    if  (vertex == v) return w; 
    else if (vertex == w) return v; 
    else throw new IllegalArgumentException("Illegal endpoint"); 
} 

我相信有一個簡單的解決方案,我無法想到這個問題。什麼是最好的方法來解決我的類型問題,同時仍然能夠從Edge類訪問我的方法?

+3

好像你需要確保你的進口是正確的.. 。 –

+0

某處你搞砸了導入,所以'edges'返回'com.sun.javafx.geom.Edge'而不是你自己的'Edge'類。看看你聲明'G'類的文件,看看它有什麼導入'邊緣' – resueman

+1

你還應該認真考慮重命名你的類,變量和方法。一個或兩個字母的名稱不會說明類或變量代表什麼。即使你可能很難弄清楚你自己的代碼是幹什麼的,1到2周。另外,尊重Java命名約定。 –

回答

1

刪除「com.sun.javafx.geom.Edge」出現的所有

而且在import語句僅使用kruskal.Edge

+0

謝謝,就是這樣。在Edge類中,我有一個我忽略的導入com.sun.javafx.geom.Edge。 – user3068177

0

問題是你引用了錯誤的Edge類。

for (com.sun.javafx.geom.Edge e : G.edges()) { 
    int v = e.either(), w = e.other(v); 
    if (!uf.connected(v, w)) { 
     System.err.println("Not a spanning forest"); 
     return false; 
    } 
} 

應該是這樣的:

for (com.your.project.model.Edge e : G.edges()) { 
    int v = e.either(), w = e.other(v); 
    if (!uf.connected(v, w)) { 
     System.err.println("Not a spanning forest"); 
     return false; 
    } 
} 

或只是正確地導入類。檢查您的當前導入並確保您沒有明確導入Sun的Edge