邻接列表 HashMap>无法找到其值
我正在使用图形数据的邻接列表表示来调试广度优先搜索算法:HashMap
。每个 String 键都是一个地铁站的名称,每个 ArrayList 是该站的边列表。
我使用队列按照遍历的顺序存储图形的节点。所以我检查队列中的下一个是否是孩子的名字。然后,我想要通过使用类似 childEdges =stationAdjacencyList.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
谢谢!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
因此,一个好的测试是查看在同一位置使用硬编码值调用
adjacencyList.get("valid endpoint");
是否会返回非空列表。如果没有,那么adjacencyList
就会在某个地方被破坏,如果是,那么endpointName
并不像您想象的那么正确。So a good test is to see if calling
adjacencyList.get("valid endpoint");
in the same spot with a hardcoded value will return a non-null list. If it doesn't thenadjacencyList
is getting destroyed somewhere, if it does thenendpointName
isn't as correct as you think it is.