我的代码从给定的文本文件创建并打印邻接列表,但是当打印出来时,在我使用的任何输入文件的第二个节点之后留下一个空格。这是代码的主要部分:
class Neighbor {
public int vertexNum;
public Neighbor next;
public Neighbor(int vnum, Neighbor nbr) {
this.vertexNum = vnum;
next = nbr;
}
}
class Vertex {
String name;
Neighbor adjList;
Vertex(String name, Neighbor neighbors) {
this.name = name;
this.adjList = neighbors;
}
}
public class Graph
{
static Vertex[] adjLists;
public Graph(String file) throws FileNotFoundException
{
Scanner fileScanner = new Scanner(new File(file));
fileScanner.useDelimiter("[^A-Za-z0-9]");
ArrayList<String> words = new ArrayList<String>();
while (fileScanner.hasNext())
{
String nextWord = fileScanner.next();
if (!words.contains(nextWord))
{
words.add(nextWord);
}
}
adjLists = new Vertex[words.size()];
// read vertices
for (int v=0; v < adjLists.length; v++)
{
adjLists[v] = new Vertex(words.get(v), null);
}
// read edges
Scanner sc = new Scanner(new File(file));
while (sc.hasNext())
{
// read vertex names and translate to vertex numbers
int v1 = indexForName(sc.next());
int v2 = indexForName(sc.next());
// add v2 to front of v1's adjacency list and
// add v1 to front of v2's adjacency list
adjLists[v1].adjList = new Neighbor(v2, adjLists[v1].adjList);
// Doesn't add the node twice if it's connected to itself
if(v1!=v2) {
adjLists[v2].adjList = new Neighbor(v1, adjLists[v2].adjList);
}
}
}
int indexForName(String name)
{
for (int v=0; v < adjLists.length; v++) {
if (adjLists[v].name.equals(name)) {
return v;
}
}
return -1;
}
public void print()
{
System.out.println();
for (int v=0; v < adjLists.length; v++) {
System.out.print(adjLists[v].name);
for (Neighbor nbr=adjLists[v].adjList; nbr != null;nbr=nbr.next) {
System.out.print(" --> " + adjLists[nbr.vertexNum].name);
}
System.out.println("\n");
}
}
以下是示例输出:
Sara --> Ajay --> Sam
Sam --> Mira --> Sean --> Sara
Ajay --> Sara
Sean --> Sam
etc.
为什么Sam和Ajay之间存在这种差距?无论列表有多长,或者我使用的是什么文件,第2节点和第3节点之间总是存在间隙,并且当在列表上运行分析时它会产生影响,因为它实际上是在读取空行并将其计为节点。这不会发生在列表中的任何其他位置,就在第二个节点之后。
我的输入数据如下所示
Sara Sam
Sara Ajay
Sam Sean
Sam Mira
Mira Jane
etc.
致电打印:
Scanner br = new Scanner(System.in);
System.out.print("Enter graph input file name: ");
String file = br.nextLine();
Graph graph = new Graph(file);
graph.print();
答案 0 :(得分:0)
如果您调试代码,您将看到单词ArrayList的第三个元素是一个空字符串。这是由于文件的读取方式以及输入的处理方式。
注释fileScanner.useDelimiter行可提供正确的输出。否则你可以添加以下条件:
if (!nextWord.isEmpty() && !words.contains(nextWord)) {
words.add(nextWord);
}
它应该没问题。