#java #insert #text-files #java.util.scanner #avl-tree
#java #вставить #текстовые файлы #java.util.scanner #avl-tree
Вопрос:
Я работаю над проектом, который берет файл .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
Метод чтения .txt-файла и вставки в дерево:
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.nnn");
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 Systemnnn");
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.nnn");
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();
}
}
Я более чем рад предоставить дополнительную информацию.
Спасибо!
Ответ №1:
Ваш статический метод 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);
}