这是一个学校项目。我们应该在HashMap的帮助下编写一个处理图形的程序。每个节点(或角落?)都有一个密钥(我们有一个连接的另一个节点)和一个值(这个连接的成本)。我差不多完成了,除了toString()
方法之外,我的所有测试用例都有效。它应该写成这样的东西:
{(0,1), (2,1)}
这意味着0和1连接,2和1连接。
/**
* Returns a string representation of this graph.
*
* @return a String representation of this graph
*/
@Override
public String toString() {
// TODO
StringBuilder sb = new StringBuilder();
sb.append("{");
for (int i = 0; i < edges.length; i++) {
for (int j = 0; j < edges[i].size(); j++) {
if (edges[i].containsKey(j)) {
if (j < edges[i].size() - 1) {
sb.append("(" + i + "," + j + "),");
} else if (j == edges[i].size() - 1) {
sb.append("(" + i + "," + j + ")");
}
}
}
if (i != edges.length - 1) {
sb.append(", ");
}
}
sb.append("}");
System.out.println(sb.toString());
return sb.toString();
}
由于我们的代码结构(我们开始使用的代码)具有HashMap的静态大小,因此如果我为5个节点创建一个图形并且只添加其中的3个,则会获得NPE。当我尝试打印这些时,由于edges[i].containsKey(j))
,我将获得NPE。
答案 0 :(得分:1)
您可能没有初始化edge数组的每个元素。
在尝试检查密钥是否包含之前,您可以测试边索引是否为空。
变化:
if (edges[i].containsKey(j))
要:
if (edges[i] != null && edges[i].containsKey(j))
由于短路评估,这是可能的:
http://en.wikipedia.org/wiki/Short-circuit_evaluation
如果值为null,您甚至可能不想进入嵌套的for循环。在这种情况下,将嵌套的for循环包裹在条件周围以确保edges [i]!= null。