邻接列表添加关系

时间:2014-03-26 02:22:44

标签: java graph nullpointerexception adjacency-list

我刚开始使用图表,我正在尝试使用城市构建邻接列表。这两个城市被发送到addRelation方法。我想说,如果已经没有匹配第一个或最后一个字符串的顶点,请创建一个新的顶点,其中的字符串不存在。现在,我得到的是带有 * 的行的空指针异常。有没有人对我做错了什么或我应该做什么有任何想法?

public class AdjList {

public class Node{
    int num;
    Node next;
    Node(int num, Node next){
        this.num=num;
        this.next=next;
    }
}

public class Vertex{
    String city;
    Node list;
    Vertex(String city, Node next){
        this.city=city;
        this.list=next;
    }
}

Vertex [] aList= new Vertex [50];

void addRelation(String from, String to) {
    for(int i=0; i<aList.length; i++){
        ****if(!aList[i].city.equals(from)){****
            aList[i]=new Vertex(from, null);
        }       
        if(aList[i].city.equals(from)){
            aList[i]=new Vertex(from, null);
        }
    }
}

主:

public static void main(String args[]) {
    AdjList g = new AdjList ();
    g.addRelation("Atlanta",  "Chattanooga");
    g.addRelation("Chattanooga",  "Nashville");
    g.addRelation("Chattanooga",  "Knoxville");
    g.addRelation("Atlanta",  "Birmingham");
    g.addRelation("Greenville", "Knoxville");
}

1 个答案:

答案 0 :(得分:0)

在您编写的代码行中

Vertex [] aList= new Vertex [50];

这只是为您分配足够的空间可能最多可容纳50个Vertex个项目。但这并不意味着阵列将在分配后立即填充它们。所以你基本上有容量来存储50个Vertex项目。

在您的方法addRelation中检查是否!aList[i].city.equals(from),但aList数组没有任何实际的Vertex对象,因此当您尝试查询{{来自city的1}}字段,您实际上是在尝试查询空对象,因此是空指针异常。

这有两种解决方法。

  • 在继续循环之前检查null(正如您在评论中所建议的那样)
  • 在调用任何方法之前,使用虚拟aList[i]对象填充数组。

虚拟方法需要您使用构造函数参数的空字符串/ null参数初始化对象,或者您可以实现默认构造函数,只需说出Vertex然后自定义new Vertex()和{ {1}}代码逻辑中city对象的字段。