对象差异化

时间:2013-07-19 10:29:37

标签: graph

我正在通过读取格式为

的文件创建包含节点(具有整数值)和边(源,目标和重量)的图形

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

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