在person.txt中,我们存储了此人的详细信息。 好像就是这样。
John
Smith
aösldkjf
5
8645
asdfasf
0441234545
++++++
Adam
Gilchrist
ads
asf
asf
asfd
0441234546
++++++
然后我们构建了FileManager类来读取该文件中的数据。 它标识有两个不同的条目。 但它始终读取前8行并且不继续前进。由于第一个人(例如: - John Smith)被添加到“LinkedList”两次,名为AddressBook。
//文件管理器类
public class FileManager {
public static void readFile() {
Scanner x;
LinkedList<String> tempList = new LinkedList<String>();
try {
x = new Scanner(new File("Person.txt"));
@SuppressWarnings("unused")
String temp = null;
while (x.hasNext()) {
tempList.add(x.next());
tempList.add(x.next());
tempList.add(x.next());
tempList.add(x.next());
tempList.add(x.next());
tempList.add(x.next());
tempList.add(x.next());
tempList.add(x.next());
Person person = new Person();
person.addFilePerson(tempList);
Main.addressBook.add(person);
}
} catch (Exception e) {
System.out.println("could't find the file");
}
}
}
//类Person中的addFilePerson方法
public void addFilePerson(LinkedList<String> list){
vorname = list.get(0);
nachname = list.get(1);
strasse = list.get(2);
hausnummer = list.get(3);
plz = list.get(4);
telefon = list.get(5);
wohnort = list.get(6);
}
答案 0 :(得分:1)
您正在创建一个 LinkedList<String>
并重复添加。移动这一行:
LinkedList<String> tempList = new LinkedList<String>();
进入while
循环。或者 - 最好是IMO--对不同部分使用不同的属性:
// TODO: Consider what happens if the file runs out half way through a person...
while (x.hasNext()) {
Person person = new Person();
person.setFirstName(x.next());
person.setLastName(x.next());
person.setStreet(x.next());
person.setTown(x.next());
person.setTelephoneNumber(x.next());
person.setCity(x.next()); // Or whatever...
Main.addressBook.add(person);
}
为Person
创建“构建器”类型并使Person
本身不可变,还有其他选项,您可能想要创建单独的Address
类型...
答案 1 :(得分:1)
您应该在从文件中读取人员之间清除(或重新创建)列表。否则,您将继续将相同的人(您阅读的第一个人)添加到地址簿中。因此,每次在Jon建议时重新创建循环内的临时列表,或者在每轮之后清除它:
while (x.hasNext()) {
tempList.add(x.next());
...
Main.addressBook.add(person);
tempList.clear();
}
答案 2 :(得分:1)
它实际上继续前进。这一行:
person.addFilePerson(tempList);
您将tempList
作为参数发送,但在addFilePerson
方法中,您始终会阅读tempList
的前7个条目。你应该在循环的每次迭代中清除tempList
。
答案 3 :(得分:0)
您应该使用nextLine()和hasNextLine()而不是next()和hasNext()。扫描程序具有上下文感知功能,因此默认令牌读取行为可能不是基于行的。
答案 4 :(得分:0)
你做得更好
Person person = new Person();
Address address = new Address();
person.setAddress(address);
person.setFirstName(x.next());
person.setLastName(x.next());
address.setStreetName(x.next());
address.setHouseNumber(x.next());
address.setZipCode(x.next());
person.setPhoneNumber(x.next());
address.setCityName(x.next());