我在PHP中工作2年后返回Java。 很抱歉,如果这似乎愚蠢:Java递归按值传递/参考
这是代码(图的深度优先遍历):
public List<List<Edge>> paths = new ArrayList<>();
public void traverse(Edge edge, List<Edge> currentPath){
String vertex = graph.getEdgeTarget(edge);
if(edge!=null) currentPath.add(edge);
if(vertex=="TARGET_VERTEX"){
System.out.println(currentPath); // prints fine
paths.add(currentPath); // elements are empty at end of reccursion
if(edge!=null) currentPath.remove(edge);
return;
}
for(Edge e : graph.outgoingEdgesOf(vertex)){
traverse(e, currentPath);
}
if(edge!=null) path.remove(edge);
}
public void search(){
//graph is initalized, vertices and edges are added
for(Edge e : graph.outgoingEdgesOf("START_VERTEX")){
traverse(e, new ArrayList<Edge>());
}
System.out.println("############################");
System.out.println(paths);
System.out.println(paths.size());
}
有人可以解释为什么在递归结束paths
具有空元素,以及如何使它包含我需要的路径?
好像通过引用传递使我的问题...
ArrayList
具有浅clone()
方法,这将不可复制的元件(如每JavaDoc的)。
我是否需要创建一个临时变量,它将手动复制currentPath
(遍历值)?
我仍然有点困惑按值传递,并通过在Java引用,这在PHP是容易通过使用由基准通行区分(&variable
。)
感谢。
编辑,以便我不会抱怨字符串比较
Java是*通过值*。期。你也没有正确比较字符串。 –
http://stackoverflow.com/questions/40480/is-java-pass-by-reference – assylias