我正在尝试编写一个程序,将文本文件的内容保存到单个链接列表中,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();
}
}
答案 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);
}