我遇到了图表分配方面的麻烦,我遇到了一个我似乎无法找到的问题。
System.out.println(plattegrond.getGraph().neighbours("Een").toString());
System.out.println(plattegrond.isRoute("Een", "Drie", new HashSet<String>()));
这些代码行打印
[Twee, Drie, Vier]
false
看来,“Een”有“Twee”,“Drie”和“Vier”作为邻居。 但是,isRoute方法返回false。方法如下所示。
public boolean isRoute(String nodeA, String nodeB, Set<String> visited) {
visited.add(nodeA);
if(nodeA.equals(nodeB)) {
return true;
}
for(String neighbour : graph.neighbours(nodeA)) {
if(!visited.contains(neighbour)) {
return isRoute(neighbour, nodeB, visited);
}
}
return false;
}
我已经使用调试器跟踪了所有步骤,并且在增强的for循环中,“Drie”不会作为邻居出现。然而,“Twee”和“Four”将会。如果我试图找到“Zes”的路径,也会出现同样的问题。当我问“Twee”它的邻居是什么时,它会说
[Een, Vier, Zes]
当我要求它找到“Zes”的路线时,isRoute方法将再次返回false。再次 “Zes”不会作为邻居出现在循环中。 但是,当我要求它找到“Twee”或“Four”的路线时,它将返回true。
我完全失去了这个。
答案 0 :(得分:0)
那里有一个问题...在你的for中你有IF语句返回..第一个邻居是Twee而它不在列表中所以它将访问Twee并且永远不会回到下一次迭代因为那个退货声明。
尝试使用布尔变量并执行以下操作:
boolean b = false;
for(String neighbour : graph.neighbours(nodeA)) {
if(!visited.contains(neighbour)) {
// this statement can never change b to false once it becomes true
// and you make sure you return after checking your whole set of neighbours
b = b || isRoute(neighbour, nodeB, visited);
}
}
return b;
这可能不是确切正确的解决方案,但至少现在你知道你的问题在哪里......你在第一个项目之后返回而不是遍历所有邻居。