0

我正在通过读取格式为的文件创建一个包含节点(整数值)和边(源、目标和权重)的图

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);

        }

类节点还有一个字段“邻居数”,我想遍历所有边并在源或目的地出现时增加邻居的数量。

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 ,就好像涉及其他一些对象一样。

4

1 回答 1

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);
于 2013-07-19T10:46:24.420 回答