java - 从文件中读取字符串并为图创建邻接列表

标签 java graph adjacency-list

这里是新手!!对于我的项目,我必须从文件中以字符串形式读取数据,并使用邻接列表创建 BFS 图形。我从文件中读取每一行,并将第一个字符串作为键,将下一个字符串作为它的邻居。但我不明白,为什么我会得到空指针异常。请看看我的代码。我的文件看起来像这样

城市.txt

city1  city2   10
city1  city3   15
city2  city1   5
city2  city3   6 
city2  city4   22
city2  city5   1
city3  city4   9
city3  city5   16
city4  city1   4
city4  city2   8
city5  city2   1
city5  city3   13

我的 Graph.java 文件是

import java.io.*;
import java.util.*;

public class Graph {

    Map<String, LinkedList<String>> adj;

    public Graph() {
    // TODO Auto-generated constructor stub
    }

    public Graph(String[] nodes) 
    {
       adj = new HashMap<String, LinkedList<String>>();
       for (int i = 0; i < nodes.length; ++i) 
       {
          adj.put(nodes[i], new LinkedList<String>());
       }
    }

    public void addNeighbor(String v1,String v2) {
       adj.get(v1).add(v2);
    }

    public List<String> getNeighbors(String v) {
       return adj.get(v);
    }

    public void getKeyValuePairs()
    {
        Iterator iterator = adj.keySet().iterator();

        while (iterator.hasNext()) {
           String key = iterator.next().toString();
           LinkedList<String> value = adj.get(key); 
           System.out.println(key + " " + value);
        }
    }

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("city.txt");
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line = br.readLine();
        String [] tokens = line.split("\\s+");
        String [] nodes = new String[tokens.length];
        for (int i = 0; i < nodes.length; ++i) {
           nodes[i] = tokens[i];
        }

        Graph g = new Graph(nodes);
        String var_1 = tokens[0];
        String var_2 = tokens[1];
        //String var_3 = tokens[2];



        while( (line = br.readLine()) != null )
        {

           tokens = line.split("\\s+");
           nodes = new String[tokens.length];
           for (int i = 0; i < nodes.length; ++i) {
              nodes[i] = tokens[i];
           }

           var_1 = tokens[0];
           var_2 = tokens[1];
           //String var_3 = tokens[2];

           g.addNeighbor(var_1, var_2);

        }
        g.getKeyValuePairs();
        br.close();
     }

  }

我在 g.addNeighbor(var_1, var_2) 行中收到空指针异常错误,如何解决该问题。有人可以为此提出一些解决方案吗?

编辑..

我还使用 getKeyValuePairs() 来查看邻接列表,但我得到了一些奇怪的输出。有什么可能的建议为什么会发生这种情况吗?

输出:

 [city2]
city1 [city2, city2]
city2 [city2, city2, city2, city2]
city3 [city2, city2]
city4 [city2, city2]
city5 [city2, city2]

最佳答案

因为你的 HashMap adj 不包含顶点 var_1。您只需将第一条线的顶点添加到图形中。

编辑:下面是一个工作示例:

public class Graph
{
    Map<String, LinkedList<String>> adj;

    public Graph() {
        adj = new HashMap<String, LinkedList<String>>();
    }

    public void addNode(String node) 
    {
        adj.putIfAbsent(node, new LinkedList<String>());
    }

    public void addNeighbor(String v1,String v2) {
       adj.get(v1).add(v2);
    }

    public List<String> getNeighbors(String v) {
       return adj.get(v);
    }

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        File file = new File("city.txt");
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        String [] tokens;

        Graph g = new Graph();
        while( (line = br.readLine()) != null )
        {
           tokens = line.split("\\s+");
           g.addNode( tokens[0]);
           g.addNode( tokens[1]);
           g.addNeighbor( tokens[0], tokens[1]);
        }
        br.close();
     }
}

关于java - 从文件中读取字符串并为图创建邻接列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39434956/

相关文章:

java - 缓冲图像颜色饱和度

java - 实现接口(interface)的名称冲突

java - 用于以 XML/JSON 和 API 表示图形/网络数据以进行遍历的标准规范格式

c - 在c中获取距离为2的邻居图邻接表

c - 链表创建

R:邻接表到邻接矩阵

java - 在存储中保存文本的权限android不工作

java - 如何以特定格式打印质数

java - 有向图上的边反转

javascript - 多个X轴标签谷歌图表