我的任务是从文本文件中提取所有记录(其中包含2列 - 名称和管理员名称 - 以及9行),从每个记录(名称和管理器)创建一个Employee对象,然后添加员工对象到接受Employee对象的ArrayList。
出于某种原因,当我稍后尝试遍历列表时,似乎最后一条记录就是为所有记录存储的内容。
以下是我的代码。我甚至放了一些打印行语句,以确保令牌在添加之前是正确的名称和管理员名称,但同样,当我循环浏览它之后,所有记录都显示为“Veronica和Bob”。
这是文本文件:
Betty Sam
Bob Sally
Dilbert Nathan
Joseph Sally
Nathan Veronica
Sally Veronica
Sam Joseph
Susan Bob
Veronica
这是我的方法:
List<Employee> employees = new ArrayList();
public void loadData() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("C:\\Users\\jeff\\Documents\\NetBeansProjects\\Java3Project1\\src\\java3project1\\employee.txt");
BufferedReader br = new BufferedReader(fr);
String line;
Employee e = new Employee();
while ((line = br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line);
int counter = 0;
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (counter==0){
e.setName(token);
System.out.println("Name added: " + token);
}
if (counter == 1) {
e.setManager(token);
System.out.println("Manager set: " + token);
}
employees.add(e);
counter++;
}//end while2
}//end while1
} //end loadData()
在调用此方法后检查列表时,所有记录都显示为名称:Veronica Manager:Bob
我似乎无法弄清楚我做错了什么。非常感谢所有帮助。如果您有任何疑问或需要进一步澄清,请与我们联系。
谢谢!
答案 0 :(得分:2)
您的arraylist中的所有员工都指的是您在开始阅读文件之前创建的同一e
实例(它们都共享相同的实例)。
您需要更改
Employee e = new Employee();
while ((line = br.readLine()) != null) {
到
while ((line = br.readLine()) != null) {
Employee e = new Employee();
为每个Employee
创建一个新的独立实例,然后再将其添加到arraylist中。
您在内循环的每次迭代结束时(运行两次)添加了一名新员工,&amp;这就是你将记录翻倍的原因。
while ((line = br.readLine()) != null) {
Employee e = new Employee();
StringTokenizer st = new StringTokenizer(line);
int counter = 0;
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (counter==0){
// Set the name
}
if (counter == 1) {
// Set the manager
}
// employees.add(e); // Move this line from here
counter++;
}//end while2
employees.add(e); // to here : the name & the manager are now both set
}//end while1
答案 1 :(得分:1)
您只在此行创建一次Employee对象:
Employee e = new Employee();
然后,您只是一遍又一遍地为该Employee对象分配一个新名称,因此最终该对象具有文件中最后一个雇员的名称。您需要为每个读入的员工创建一个新的Employee对象。