当前位置: 首页 > 知识库问答 >
问题:

邻接列表添加关系

蒙胤
2023-03-14

我刚开始使用图形,我正在尝试建立一个使用城市的邻接列表。这两个城市被发送到addRelations方法中。我试着说,如果已经没有一个顶点与第一个或最后一个字符串匹配,就用还不存在的字符串创建一个新顶点。现在,我得到的只是一个空指针异常在行的*。有没有人知道我做错了什么或者我应该做什么?

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个答案

姜永贞
2023-03-14

在您编写的代码行中

Vertex [] aList= new Vertex [50];

这只是为您分配了足够的空间,使您可以容纳最多50个vertex项。但是,这并不意味着数组将在分配后立即被它们填充。因此您基本上可以存储50个vertex项。

在您的方法addrelation中,它正在检查!list[i].city.equals(from),但是list数组没有任何实际的vertex对象,因此当您试图从list[i]查询city字段时,您实际上是试图查询一个空对象,因此出现空指针异常。

对此有两种变通方法。

  • 在继续循环之前检查是否为空(如您在注释中所建议的)
  • 在调用任何方法之前,使用虚拟顶点对象填充数组。

虚拟方法要求您使用空字符串/空参数作为构造函数参数来初始化对象,或者您可以实现默认构造函数,只说new Vertex(),然后在代码逻辑中自定义Vertex对象的citynext字段。

 类似资料:
  • 这个 邻接列表 模式是一种常见的关系模式,通过该模式,表包含对其自身的外键引用,换言之,是 自指关系 。这是在平面表格中表示分层数据的最常见方式。其他方法包括 嵌套集 ,有时称为“修改的预购”,以及 物化路径 。尽管在评估SQL查询内的流畅性时,修改的预排序很有吸引力,但由于并发性、降低复杂性的原因,邻接列表模型可能是最适合大多数分层存储需求的模式,而且与可以将子树完全加载到应用程序空间的应用程序

  • `使用命名空间标准;

  • 作为一项练习,我必须建立一个卫星导航系统,规划从一个位置到另一个位置的最短和最快路线。它必须尽可能快,而不需要使用太多内存。 我很难决定使用哪种结构来表示图形。我知道矩阵更适合密集图,列表更适合稀疏图。我更倾向于使用列表,因为我认为添加顶点将是这个程序中最累人的部分。 我只是想听听你们的意见。如果我把一个典型的路线图看作一个图形,其中不同的位置是节点,道路是边缘。你认为它是稀疏的还是密集的?在这种

  • 实现稀疏连接图的更空间高效的方法是使用邻接表。在邻接表实现中,我们保存Graph 对象中的所有顶点的主列表,然后图中的每个顶点对象维护连接到的其他顶点的列表。 在我们的顶点类的实现中,我们将使用字典而不是列表,其中字典键是顶点,值是权重。 Figure 4 展示了 Figure 2中的图的邻接列表示。 Figure 4 邻接表实现的优点是它允许我们紧凑地表示稀疏图。 邻接表还允许我们容易找到直接连

  • 我遇到了一个将Dijkstras算法的伪代码转换为实际代码的问题。我给出了邻接列表,如“位置-相邻位置-到位置的距离”,一个节点的例子:AAA AAC 180 AAD 242 AAH 40。我的任务是读取一个按邻接列表组织的文件,并计算从一个节点到另一个节点的最短路径。下面是Dijkstra伪代码: 我遇到的最大的麻烦是“对于与v相邻的每个顶点w”这一行,这里是我的非工作代码: 使用我的顶点类,我