2015-11-04 51 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