这里是新手!!对于我的项目,我必须从文件中以字符串形式读取数据,并使用邻接列表创建 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/