Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的方法没有';无法达到预期的返回语句_Java - Fatal编程技术网

Java 我的方法没有';无法达到预期的返回语句

Java 我的方法没有';无法达到预期的返回语句,java,Java,我已经盯着这个看了好几个小时,不知道出了什么问题 我正在尝试实现一种方法,使用深度优先搜索算法确定图中两个顶点之间是否存在路径 然而,虽然它似乎成功地找到了它需要找到的顶点,但它没有到达return语句 我尝试过使用不同的变量,打印东西,更改订单,但无法使其返回真值。任何帮助都将不胜感激 public class Path<V,E> { private HashMap<V,Boolean> visited = new HashMap<V,Boolean>()

我已经盯着这个看了好几个小时,不知道出了什么问题

我正在尝试实现一种方法,使用深度优先搜索算法确定图中两个顶点之间是否存在路径

然而,虽然它似乎成功地找到了它需要找到的顶点,但它没有到达return语句

我尝试过使用不同的变量,打印东西,更改订单,但无法使其返回真值。任何帮助都将不胜感激

public class Path<V,E> {

private HashMap<V,Boolean> visited = new HashMap<V,Boolean>();

public boolean pathExists(Graph<V,E> graph, V v1, V v2) {

    if (v1.equals(v2)) {
        System.out.println("v1 = v2");
        return true;
    }

    if (!visited.containsKey(v1)) {
        System.out.println("v1 discovered: "+v1);
        visited.put(v1, true);
    }

    for (V v : graph.getNeighbors(v1)) {

        if (v.equals(v2)) {
            visited.clear();
            System.out.println("v discovered: "+v);
            return true;
        }

        if (!visited.containsKey(v)) {
            visited.put(v,true);
            System.out.println("visited doesn't contain v: "+v);
            System.out.println("starting new search with "+v);
            pathExists(graph,v,v2);
        }

    }
    visited.clear();
    return false;
}



public static void main(String[] args) {

    MyGraph<String,String> mg = new MyGraph<String,String>();
    Path<String,String> path = new Path<String,String>();

    mg.insertVertex("utrecht");
    mg.insertVertex("amsterdam");
    mg.insertVertex("maastricht");

    mg.insertEdge("utrecht", "amsterdam", "route1", 2);
    mg.insertEdge("amsterdam", "maastricht", "route2", 1);

    boolean c = path.pathExists(mg, "utrecht", "maastricht");

    System.out.println(c);

}
}
公共类路径{
private HashMap visited=新建HashMap();
公共布尔路径存在(图形,vv1,vv2){
如果(v1等于(v2)){
System.out.println(“v1=v2”);
返回true;
}
如果(!已访问。容器(v1)){
System.out.println(“v1发现:+v1”);
visited.put(v1,true);
}
for(V:graph.getNeights(v1)){
如果(v等于(v2)){
已访问。清除();
System.out.println(“v发现:+v”);
返回true;
}
如果(!已访问。容器(v)){
访问。放置(v,true);
System.out.println(“已访问的不包含v:+v”);
System.out.println(“用“+v”开始新的搜索);
路径存在(图,v,v2);
}
}
已访问。清除();
返回false;
}
公共静态void main(字符串[]args){
MyGraph mg=新的MyGraph();
路径路径=新路径();
mg.insertVertex(“乌得勒支”);
mg.insertVertex(“阿姆斯特丹”);
mg.insertVertex(“马斯特里赫特”);
mg.insertEdge(“乌得勒支”、“阿姆斯特丹”、“1号公路”、2号公路);
mg.insertEdge(“阿姆斯特丹”、“马斯特里赫特”、“路线2”,1);
布尔c=path.pathExists(mg,“乌得勒支”、“马斯特里赫特”);
系统输出打印ln(c);
}
}
这是控制台输出

v1 discovered: utrecht<br>
visited doesn't contain v: amsterdam<br>
starting new search with amsterdam<br>
v discovered: maastricht<br>
false<br>
v1发现:乌得勒支
已访问不包含v:amsterdam
从阿姆斯特丹开始新的搜索
v发现:马斯特里赫特


由于它正在打印“v discovered:maastricht”,我希望它返回true,但它返回false。

程序中有两个主要错误

  • 找到顶点后,确实返回
    true
    ,但不使用返回值。由于您的方法是递归的,因此返回值将丢失

    而不是

    pathExists(graph,v,v2);
    
    你应该写

    if(pathExists(graph,v,v2)) return true;
    
  • 在递归过程中,您错误地清除了已访问的地图。
    首先,它根本不需要,除非您需要在访问后重新使用已访问的地图。但即使在这种情况下,最好在您的方法之外清除它。
    虽然
    if(v.equals(v2))
    下的
    visitored.clear()
    不是一个真正的问题(除了前面的备注),但是for循环之后的第二个问题将创建bug。 例如,考虑下面的顶点及其邻接表:

    1 -> [2, 4]
    2 -> [3]
    4 -> [1, 5]
    5 -> []
    
    假设您查找顶点
    5
    ,然后从顶点
    1
    开始。您将访问vertex
    2
    和vertex
    3
    。您访问的
    地图包含
    [1,2,3]
    。A顶点
    3
    pathExists
    末端存在,因为您没有找到
    5
    3
    作为无邻居,所以您可以清除已访问的
    地图。然后访问顶点
    4
    ,由于已清除地图,因此它只包含
    [4]
    。因此,您再次访问
    1
    ,依此类推

  • 这实际上不是一个错误,但不需要创建
    映射。只需创建一个
    ,并检查是否存在顶点


  • 欢迎来到堆栈溢出!看起来您可能需要学习使用调试器。请随便吃点。如果以后仍有问题,请将问题更具体地说明您需要什么帮助。您在for循环中返回true,它只退出for循环,而不退出方法。相反,将标志设置为true,返回for循环,如果该标志在方法上设置为true,则返回true谢谢Ricola,这对我帮助很大,该方法现在可以正常工作并正确发现所有路径!