为什么我的邻接列表包含空格? (JAVA)

时间:2018-01-25 13:54:47

标签: java list space

我的代码从给定的文本文件创建并打印邻接列表,但是当打印出来时,在我使用的任何输入文件的第二个节点之后留下一个空格。这是代码的主要部分:

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();

1 个答案:

答案 0 :(得分:0)

如果您调试代码,您将看到单词ArrayList的第三个元素是一个空字符串。这是由于文件的读取方式以及输入的处理方式。

注释fileScanner.useDelimiter行可提供正确的输出。否则你可以添加以下条件:

        if (!nextWord.isEmpty() && !words.contains(nextWord)) {
            words.add(nextWord);
        }

它应该没问题。