问题描述
我正在一个需要一个.txt文件并读取记录列表并将其插入AVL树的项目中。似乎可以从文件中读取记录,但是只能将文件中的最后一条记录插入树中。还有一个命令行界面,允许用户将记录添加到树中。该接口可以正常工作并插入其他记录。这是.txt文件和代码的示例。
.txt file:
# Names for database
# Don't modify this file
# These are comments
# File description:
# ID,FirstName LastName Age
1 Aeris Lopez 18
2 Sofia Yeong 33
public static void readRecords() throws FileNotFoundException {
int idNumber = 0;
String fName = "";
String lName = "";
String age = "";
String line = "";
Scanner inFile = new Scanner(new FileReader("test.txt"));
inFile.nextLine();
inFile.nextLine();
inFile.nextLine();
inFile.nextLine();
inFile.nextLine();
while (inFile.hasNext()) {
idNumber = inFile.nextInt();
record.setIdNumber(idNumber);
fName = inFile.next();
record.setfName(fName);
lName = inFile.next();
record.setlName(lName);
if (inFile.hasNext())
age = inFile.next();
else
age = "";
record.setAge(age);
tree.insert(record);
System.out.println(record);
}
inFile.close();
}
public static void commands() {
// commandList();
Scanner console = new Scanner(system.in);
Record record = new Record();
int choice = console.nextInt();
int idNumber;
String age;
int count = 0;
String lName = "";
String fName = "";
switch (choice) {
case 1: //Allows user to search for record by last name.
System.out.println("Enter the last name to search for.\n");
findLName = console.next();
// AVLTree.findLastName(record);
commands();
break;
case 2: //Allows user to search for record by first and last name.
System.out.println("Enter the first and last name to search for.\n");
findFName = console.next();
findLName = console.next();
commands();
break;
case 3: //Allows user to add a new record.
System.out.println("Enter the id number,first name,last name,and age" +
"of the record to be added.\n");
idNumber = console.nextInt();
record.setIdNumber(idNumber);
fName = console.next();
record.setfName(fName);
lName = console.next();
record.setlName(lName);
age = console.next();
record.setAge(age);
RecordUtils.tree.insert(record);
System.out.println("Record #" + idNumber + " has been added.\n\n\n");
RecordUtils.tree.printTree(AVLTree.root);
commands();
break;
case 4: //Prints out the total number of records in the AVL tree.
System.out.println("There are " + RecordUtils.tree.countNodes() + " records in The Amazo Name " +
"Storage Program Shadow Magic 2000 System\n\n\n");
commands();
break;
case 5: //Prints out the user command list.
commandList();
commands();
break;
case 6: //Prints out the author of the code.
System.out.println("This code was created by Toby Myers.\n\n\n");
commands();
break;
case 7: //Allows the user to exit the program.
System.out.println("Exiting The Amazo Name Storage Program " +
"Shadow Magic 2000 System.");
System.exit(0);
break;
default: //Notifies user if invalid input is entered.
System.out.println("Invalid Input");
commands();
}
}
我很乐意提供更多其他信息。
谢谢!
解决方法
您的静态方法readRecords将信息添加到Record
对象中,但是由于该对象不是在方法中创建的,因此您将在同一实例中为每一行覆盖信息。
解决方案是为每一行创建一个新对象
while (inFile.hasNext()) {
Record record = new Record(); //<-- This is needed
idNumber = inFile.nextInt();
record.setIdNumber(idNumber);
fName = inFile.next();
record.setfName(fName);
lName = inFile.next();
record.setlName(lName);
if (inFile.hasNext())
age = inFile.next();
else
age = "";
record.setAge(age);
tree.insert(record);
System.out.println(record);
}