我正在通过读取格式为
的文件创建包含节点(具有整数值)和边(源,目标和重量)的图形1 51 1
1 72 2
1 77 1
等
Set<Node> nodes = new HashSet<Node>(); //a set of the nodes of a graph
ArrayList<Node> nodeList = new ArrayList<Node>();
ArrayList<Edge> edgeList = new ArrayList<Edge>();
...
Node node1=new Node(Integer.parseInt(temprelation[0]));
Node node2=new Node(Integer.parseInt(temprelation[1]));
nodes.add(node1);
nodes.add(node2);
Edge edge = new Edge(node1, node2, Integer.parseInt(temprelation[2]));
edgeList.add(edge);
}
类Node还有一个字段“邻居数”,我想要遍历所有边缘,并在源或目标出现时增加邻居的数量。
for (int edge=0; edge<graph.getEdges().size(); edge++){
graph.getEdges().get(edge).getSource().neighborUp();
graph.getEdges().get(edge).getDestination().neighborUp();
}
奇怪的是,虽然对象似乎是相同的(我用等号检查),但计数器不会上升。例如,对于1,它在第一个边缘上升一次,但是当我尝试在第二个边缘时增加它时,它不会上升。当在递增之前考虑第二个边缘时,它以某种方式显示邻居的数量是0,尽管我增加了已经在第一个边缘中的第一个节点的邻居的数量。因此,如果我在增量之前和之后打印出计数器,我总是得到0 1 0 1,就好像其他一些对象一样。
答案 0 :(得分:0)
我假设你使用Java。 问题在于创建图形,每次创建边缘时都会为节点创建新对象:
Node node1=new Node(Integer.parseInt(temprelation[0]));
Node node2=new Node(Integer.parseInt(temprelation[1]));
该集合仅包含每个Integer的一个副本,但您的边缘包含不同的实例。
要解决此问题,您可以创建所有已解析节点的地图,并在每次迭代时而不是从Integer创建对象,检查您是否已从Integer创建对象:
//one global object
Map<Integer,Node> map = new HashMap<Integer,Node> ();
...
Integer val = Integer.parseInt(temprelation[0]);
if (map.get(val)==null) {
map.put(val, new Node(val));
}
Node node1 = map.get(val);
val = Integer.parseInt(temprelation[1]);
if (map.get(val)==null) {
map.put(val, new Node(val));
}
Node node2 = map.get(val);