从文本文件写入 Java ArrayList 给我问题
Write to Java ArrayList from text file giving me issues
我的任务是从一个文本文件(有 2 列-姓名和经理姓名-和 9 行)中提取所有记录,从每条记录(姓名和经理)创建一个 Employee 对象,然后添加employee 对象到接受 Employee 对象的 ArrayList。
出于某种原因,当我稍后尝试遍历列表时,似乎最后一条记录是为所有记录存储的内容。
下面是我的代码。我什至添加了一些打印行语句,以确保令牌在添加之前是正确的名称和经理名称,但同样,当我之后循环遍历它时,所有记录都显示为 "Veronica and 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 经理:Bob
我似乎无法弄清楚我做错了什么。非常感谢所有帮助。如果您有任何问题或需要更多说明,请告诉我。
谢谢!
您只创建了一次 Employee 对象,在这一行:
Employee e = new Employee();
然后您只是一遍又一遍地为该 Employee 对象分配一个新名称,所以最后该对象具有您文件中最后一位员工的名称。您需要为读入的每个 Employee 创建一个新的 Employee 对象。
arraylist 中的所有员工都引用您在开始读取文件之前创建的同一个 e
实例,(他们都共享同一个实例).
你需要改变
Employee e = new Employee();
while ((line = br.readLine()) != null) {
至
while ((line = br.readLine()) != null) {
Employee e = new Employee();
以便在将其添加到数组列表之前为每个 Employee
创建一个新的单独实例。
编辑:
您在内部循环(运行两次)的每次迭代结束时添加了一名新员工,这就是为什么您将记录加倍的原因。
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
我的任务是从一个文本文件(有 2 列-姓名和经理姓名-和 9 行)中提取所有记录,从每条记录(姓名和经理)创建一个 Employee 对象,然后添加employee 对象到接受 Employee 对象的 ArrayList。
出于某种原因,当我稍后尝试遍历列表时,似乎最后一条记录是为所有记录存储的内容。
下面是我的代码。我什至添加了一些打印行语句,以确保令牌在添加之前是正确的名称和经理名称,但同样,当我之后循环遍历它时,所有记录都显示为 "Veronica and 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 经理:Bob
我似乎无法弄清楚我做错了什么。非常感谢所有帮助。如果您有任何问题或需要更多说明,请告诉我。
谢谢!
您只创建了一次 Employee 对象,在这一行:
Employee e = new Employee();
然后您只是一遍又一遍地为该 Employee 对象分配一个新名称,所以最后该对象具有您文件中最后一位员工的名称。您需要为读入的每个 Employee 创建一个新的 Employee 对象。
arraylist 中的所有员工都引用您在开始读取文件之前创建的同一个 e
实例,(他们都共享同一个实例).
你需要改变
Employee e = new Employee();
while ((line = br.readLine()) != null) {
至
while ((line = br.readLine()) != null) {
Employee e = new Employee();
以便在将其添加到数组列表之前为每个 Employee
创建一个新的单独实例。
编辑:
您在内部循环(运行两次)的每次迭代结束时添加了一名新员工,这就是为什么您将记录加倍的原因。
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