如何将文本文件的内容保存到链表中?

时间:2015-04-17 15:42:12

标签: java linked-list

我正在尝试编写一个程序,将文本文件的内容保存到单个链接列表中,txt文件中的每一行都是一个节点。我使用Scanner从文件中读取,但我将文本放入链接列表时遇到问题。             我创建了一个链表类和一个Node类。             任何提示或帮助都会有所帮助             这是我的链接列表类:

        import java.util.Iterator;

        public class LinkedList<T> { //Generic
            private Node<T> myStart;
            private Node<T> myEnd;
            private int mySize;

            public LinkedList(){
                mySize = 0;
                myStart = null;
                myEnd = null;
            }


            // Clears the List
            public void clear(){
                myStart = null;
                myEnd = null;
                mySize = 0;
            }

            public T getFirst(){
                if (myStart == null){
                    return null;
                }
                return myStart.getValue();
            }


            public boolean isEmpty() {
                // Returns ONLY and ONLY IF "myElements" equals to 0
                return mySize == 0;
            }

            public int size() {
                return mySize;
            }

            //Add a value to the list
            public void add(T aValue ){
                Node<T> theNode = new Node<T>(aValue);
                theNode.setLink(myStart);
                myStart = theNode;
                myEnd = theNode;
                mySize++;
            }

      //Adds a value to the end of the List
            public void addToEnd(T aValue){
                Node<T> theNode = new Node<T>(aValue);
                if(myEnd == null){
                    myStart = theNode;
                    myEnd = theNode;
                }
                else {
                    myEnd.setLink(theNode);
                    myEnd = theNode;
                }
                mySize++;
            }

            //Removes a value from the list
            public void remove(T aValue){
                Node<T> current = myStart;
                Node<T> previous = null;
                while(current !=null){
                    if(current.getValue().equals(aValue)){
                        mySize--;
                        if (previous == null){
                            myStart = current.getLink();
                        }
                        else{
                        previous.setLink( current.getLink() );
                        }
                    }
                    if(current == myEnd){
                        myEnd = previous;
                    }
                    previous = current;
                    current= current.getLink();
                }
                return;
            }

            //Prints the current list
            public void print(){
                Node<T> current = myStart;
                while(current !=null){
                    System.out.print(current.toString() + " ");
                    current= current.getLink();
                }
                    System.out.println();
            }

        }   

然后我尝试在文件中读取我可以但我不知道为什么它没有正确打印List。这是我将文件添加到链表中的地方:

 public class SpellCheck<T> {

        public SpellCheck(){

        }

        //LoadData reads the file and places it in a linkedList
        public static String loadData(String fileName){
            LinkedList<String> dictionary = new LinkedList<String>(); //Create a new LinkedList called dictionary
                Scanner scan = null;
                try {
                    scan = new Scanner(new FileInputStream(fileName)); //read in the file
                } 
                catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

                while(scan.hasNext()) {
                    String theList = scan.nextLine();
                    dictionary.add(theList); //Add theList to the LinkedList "Dictionary"
                    System.out.println( dictionary ); //print it out
                }
                scan.close();
                }
    }

我的文字文件包含随机字词,例如: 吓了一跳 疾驰而去 放弃 弃 放弃 放弃 篮球 篮 姥 巴斯克 低音

在我的测试驱动程序中,这是我在TestDriver类中所做的:     公共课TestDriver {

    public static void main(String[] args) {
        LinkedList<String> theList = new LinkedList<String>();
        theList.add(SpellCheck.loadDataLinkedList("standard.txt"));
        theList.print();
        }
}

2 个答案:

答案 0 :(得分:0)

LinkedList<String> dictionary = new LinkedList<String>(); 
System.out.println( dictionary ); //print it out

您需要为LinkedList编写一个函数,以便按照您想要的方式打印LinkedList的内容。

现在它只会打印dictionary的内存地址。

您需要循环浏览列表并选取每String中存储的Node并打印出来。

这样的事情:

public void printList() {
    Node<T> node = getFirst();
    do {
        // get the String print it and move to the next node
    } while (node.myEnd != null);
}

编辑:或使用@ 9000写的内容进行打印。

答案 1 :(得分:0)

我建议你采用自上而下的方法,并使用标准类。 (重新发明一个轮子可能很有趣,但有时候你会使用来自java.util的经过战斗验证的轮子来改善。)

考虑:

public LinkesList<String> readLines(BufferedReader source) {
   LinkedList<String> result = new LinkedList<>();
   while (true) {
      String line = source.readLine();
      if (line == null) break;  // end of file
      result.add(line);
   }  
   return result;
}

LinkedList<String> loadFile(Sting filename) {
   BufferedReader reader = null; 
   try {
     reader = new BufferedReader(new FileReader(filename));
     return readLines(reader);
   } finally {
     // free up the file, exception or not.
     // yes, this happens before the return, too.
     if (reader != null) reader.close(); 
   }
}

打印列表(事实上,任何可迭代的)也很容易:

List<String> lines = ...;
for (String item : lines) {
  System.out.println(item);
}