0

这是一个学校项目。我们应该在 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)).

4

1 回答 1

1

您可能没有初始化边数组的每个元素。

您甚至可以在尝试检查键是否包含之前测试边缘索引是否不为空。

改变:

if (edges[i].containsKey(j))

至:

if (edges[i] != null && edges[i].containsKey(j))

由于短路评估,这是可能的:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

如果值为 null,您甚至可能不想进入嵌套的 for 循环。在这种情况下,将嵌套的 for 循环包裹在条件周围以确保 edge[i] != null。

于 2013-04-18T18:39:34.600 回答