在下面的代码中,resultTree是从其他函数传递的,我正在尝试更新结果树但是在最后我没有赋值,而是我首先得到了值(如果我分配了它),否则我将得到空值。以下是代码,
`
heaviest = new LinkedList<Vertex>();
mw = y.heaviestTree(graph, heaviest);
System.out.println("heaviestTree: " + mw + " : " + heaviest);
float heaviestTree(DiGraph G, LinkedList<Vertex> resultTree) {
Set<Vertex> roots = rootVertices(G);
LinkedList<Vertex>[] myList = new LinkedList[roots.size()];
Float weight = (float) 0;
Float[] weights = new Float[roots.size()];
int i = 0;
for (Vertex v : G.vertices())
v.setColor(DiGraph.WHITE);
for (Vertex v : roots) {
weights[i]=(float) 0;
LinkedList<Vertex> Temp= new LinkedList<Vertex>();
Temp.add(v);
resultTree.add(v); //For checking
innerloop:
for (Vertex neighbors : v.neighbors()) {
if (neighbors.getColor() != DiGraph.BLACK) {
Temp.add(neighbors);
neighbors.setColor(DiGraph.BLACK);
weights[i]=weights[i]+ v.getEdge(neighbors).getWeight();
}
else{
myList[i]=null;
weights[i]=(float) 0;
break innerloop;
}
}
myList[i]= Temp;
i++;
}
System.out.println("# #"+resultTree);
for (int c = 0; c < weights.length; c++)
{
if (weights[c] >weight)
{
weight = weights[c];
resultTree = myList[c];
}
}
if(resultTree.size()==0){
return Float.NaN;
}
System.out.println("# "+ resultTree);
return weight;`
OutPut
# #[[1], [3]]
# [[1], [4], [0]]
heaviestTree: 12.9 : [[1], [3]]
但我期待
# #[[1], [3]]
# [[1], [4], [0]]
heaviestTree: 12.9 : [[1], [4], [0]]
我一直在努力弄清楚我做错了什么,谢谢你的帮助
答案 0 :(得分:0)
Java 按值传递。因此,这一行
resultTree = myList[c];
不会做你认为会做的事情。让我们退一步吧。当您致电heaviestTree
时,您会传递heaviest
。之后发生的是LinkedList<Vertex>
的引用副本。如果通过方法中的引用副本对链接列表进行更改,则它将应用于heaviest
指向的实际链接列表。但是,在重新分配的情况下,它将无法工作。假设参考副本名为resultTree
。上面的行将更改resultTree
指向的内容,而不是heaviest
指向的内容。由于在方法结束时会丢弃局部变量/副本,因此在resultTree
完成后,您将无法在上一个打印语句中使用heaviestTree
。这也是为什么在方法中打印时正确打印出正确树的原因。因为该链接列表是引用副本resultTree
指向的链接列表,而heaviest
仍然指向原始链接列表。
我对解决问题的建议,
LinkedList<Vertex>
变量来保存最重的树或
LinkedList<Vertex>