我正在尝试在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类访问我的方法?
好像你需要确保你的进口是正确的.. 。 –
某处你搞砸了导入,所以'edges'返回'com.sun.javafx.geom.Edge'而不是你自己的'Edge'类。看看你声明'G'类的文件,看看它有什么导入'边缘' – resueman
你还应该认真考虑重命名你的类,变量和方法。一个或两个字母的名称不会说明类或变量代表什么。即使你可能很难弄清楚你自己的代码是干什么的,1到2周。另外,尊重Java命名约定。 –