Я ввожу список смежности для графа. Есть три столбца данных (вершина, место назначения, ребро), разделенных одним пробелом. Вот моя реализация до сих пор:
FileStream in = new FileStream("input1.txt");
Scanner s = new Scanner(in);
String buffer;
String [] line = null;
while (s.hasNext())
{
buffer = s.nextLine();
line = buffer.split("\\s+");
g.add(line[0]);
System.out.println("Added vertex " + line[0] + ".");
g.addEdge(line[0], line[1], Integer.parseInt(line[2]));
System.out.println("Added edge from " + line[0] + " to " + line[1] + " with a weight of " + Integer.parseInt(line[2]) + ".");
}
System.out.println("Size of graph = " + g.size());
Вот вывод:
Added vertex a.
Added edge from a to b with a weight of 9.
Exception in thread "main" java.lang.NullPointerException
at structure5.GraphListDirected.addEdge(GraphListDirected.java:93)
at Driver.main(Driver.java:28)
У меня сложилось впечатление, что
line = buffer.split("\\s+");
вернет двумерный массив строк в переменную line
. Казалось, сработало в первый раз, но не во второй. Какие-нибудь мысли?
Я также хотел бы получить отзыв о реализации этой проблемы. Есть ли способ лучше?
Что-нибудь, чтобы помочь новичку! :)
EDIT:
Я пробовал эту реализацию ранее сегодня, но безуспешно. Я сделал это снова здесь:
FileStream in = new FileStream("input1.txt");
Scanner s = new Scanner(in).useDelimiter("\\s+");
while (s.hasNext())
{
Scanner line = new Scanner(s.nextLine());
String vertex = line.next();
String destination = line.next();
int weight = line.nextInt();
g.add(vertex);
System.out.println("Added vertex " + vertex + ".");
g.addEdge(vertex, destination, weight);
System.out.println("Added edge from " + vertex + " to " + destination + " with a weight of " + weight + ".");
}
System.out.println("Size of graph = " + g.size());
Выход:
Added vertex a.
Exception in thread "main" java.lang.NullPointerException
at structure5.GraphListDirected.addEdge(GraphListDirected.java:93)
at Driver.main(Driver.java:22)
Edit2:
Вот функция addEdge. Это не моя собственная реализация, я использую ее, чтобы сэкономить время, когда я слабо пишу свою собственную на этом начальном этапе ...
package structure5;
import java.util.Iterator;
abstract public class GraphList<V,E> extends AbstractStructure<V> implements Graph<V,E>
{
protected Map<V,GraphListVertex<V,E>> dict; // label -> vertex
protected boolean directed; // is graph directed?
protected GraphList(boolean dir)
{
dict = new Hashtable<V,GraphListVertex<V,E>>();
directed = dir;
}
public void add(V label)
{
if (dict.containsKey(label)) return; // vertex exists
GraphListVertex<V,E> v = new GraphListVertex<V,E>(label);
dict.put(label,v);
}
abstract public void addEdge(V v1, V v2, E label);
}
Graph.java:
package structure5;
import java.util.Iterator;
public interface Graph<V,E> extends Structure<V>
{
public void add(V label);
public void addEdge(V vtx1, V vtx2, E label);
}
Примечание: я опускаю остальные методы, не относящиеся к программе
Edit3:
Вот это GraphListDirected.java
public class GraphListDirected<V,E> extends GraphList<V,E>
{
public GraphListDirected()
{
super(true);
}
public void addEdge(V vLabel1, V vLabel2, E label)
{
GraphListVertex<V,E> v1 = dict.get(vLabel1);
GraphListVertex<V,E> v2 = dict.get(vLabel2);
Edge<V,E> e = new Edge<V,E>(v1.label(), v2.label(), label, true); //Line 93
v1.addEdge(e);
}