我有一个问题,我正在用一种方法对我的Graph(节点集)执行一些操作并检索它。现在,当再次调用该方法而不是获取新的节点集时,它将继续编辑在第一个操作循环中返回的先前的节点集。我猜这是一个参考问题,但找不到解决方案。这是我的示例代码。
public class hello {
Set<Node> vertices;
private Set<Node> unChangedvertices;
public hello(PathMap map) {
GraphRep graph = new GraphRep(map); // return list of nodes in hashset
GraphRep gg = new GraphRep(map);
vertices = new HashSet<>(graph.getNodes());
unChangedvertices = new HashSet<>(gg.getNodes());
List<Set<Node>> tDistancefromAllVerteices = new ArrayList<Set<Node>>();
for (int i = 0; i <= 3; i++) {
// calculateShortestPath method will find the shortest route and return resultant graph
Set<Node> sing = new HashSet<>(calculateShortestPath(new GraphRep(map), i));
tDistancefromAllVerteices.add(sing);
}
}
public Set<Node> calculateShortestPathFromSource(GraphRep graph, Node source) {
Set<Node> settledNodes = new HashSet<>();
// this method finds shortest path from source to all Nodes like in Dijkstra.
return settledNodes;
}
}
public class GraphRep
{
private Set<Node> nodes = new HashSet<>();
/**
* @return the nodes
*/
public Set<Node> getNodes() {
return nodes;
}
// constructor
public GraphRep(PathMap map){
// adding vertices as nodes from map
}
}
在没有循环的情况下效果很好,但是每当在循环中调用方法时,它将编辑在循环的第一个索引中返回的节点集。
我们将不胜感激任何帮助。
答案 0 :(得分:0)
java中的对象是共享的。如果将节点放入集合中,并更改该节点的内部结构,字段,则集合所需的顺序可能已损坏。
因此,诸如String,Integer,Double,BigDecimal之类的类是不可变的;可以安全地共享。
很显然calculateShortestPath
或其他代码更改了某些内容,可能是w.rt。顶点和边缘。