邻接列表HashMap <string,arraylist <edge =“”>&gt;无法找到其值</string,>

时间:2011-01-11 02:58:37

标签: java hashmap breadth-first-search

我正在使用图表数据的邻接列表表示调试广度优先搜索算法:HashMap<String, ArrayList<Edge>>。每个String键都是一个地铁站的名称,每个ArrayList都是该站的边缘列表。

我正在使用队列按照遍历的顺序存储图形的节点。所以我检查队列中的下一个是否有孩子的名字。然后我想要通过使用childEdges = stationsAdjacencyList.get(childNodeName);之类的东西从adjacencyList获取子的ArrayList。

我的语法略有不同,但请查看下面的代码。

目前.get()函数没有返回ArrayList,而是每次都返回null。我知道HashMap查找正在接收正确的密钥。它只是拒绝从它的相关桶中给我任何价值。

    while (!q.empty()) {    // 

        String endpointName; // the Key part for the next node lookup 

        // get next node (single entry of adjacency list)
        Map<String, ArrayList<Edge>> currentNode = (Map<String, ArrayList<Edge>>) q.deque(); 

        HashMap<String, ArrayList<Edge>> nextNode = new HashMap<String, ArrayList<Edge>>();

        for (Map.Entry<String, ArrayList<Edge>> node : currentNode.entrySet()) { // there is only one node

            ++levelCount; // next node iteration is one level down the tree

            for (Edge edge : node.getValue()) {  // for each of this nodes Edges

                endpointName = edge.getEndpoint(); // retrieve the name of adjacent

                if (!endpointName.equals(destination)) { // if it's not the destination



                    levelTracker.put(edge.getParent(), levelCount); // record the level in the tree of this node

                    ArrayList<Edge> nextNodeEdges = adjacencyList.get(endpointName);

                    nextNode.put(endpointName, nextNodeEdges); // create child node from endpoint

                    q.enqueue(nextNode); // add child to queue

                }
                else if (endpointName.equals(destination)) { // if we're done

                    path.add(endpointName); // record the destination in the path (reverse order)

                    getPathBack(edge, levelCount + 1); // + 1 levelCount to indicate destination level in tree 

                    break;
                }
            }
        }

    }

道歉,如果代码不是那么干净或者评论不错,它会不断变化。希望有人可以告诉我为什么ArrayList<Edge> nextNodeEdges = adjacencyList.get(endpointName);没有取任何东西。

谢谢!

1 个答案:

答案 0 :(得分:2)

所以一个好的测试是看看在具有硬编码值的同一位置调用adjacencyList.get("valid endpoint");是否会返回非空列表。如果没有,那么adjacencyList会在某个地方被摧毁,如果有,那么endpointName就不像你想象的那样正确。