【问题标题】:Write to Java ArrayList from text file giving me issues从文本文件写入 Java ArrayList 给我问题
【发布时间】:2016-05-25 12:15:51
【问题描述】:

我的任务是从一个文本文件中提取所有记录(它有 2 列名称和经理名称以及 9 行),从每个记录(名称和经理)创建一个员工对象,然后添加员工对象到接受 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()

当我在调用此方法后检查列表时,所有记录都显示为 Name: Veronica Manager: Bob

我似乎无法弄清楚我做错了什么。非常感谢所有帮助。如果您有任何问题或需要更多说明,请告诉我。

谢谢!

【问题讨论】:

标签: java file arraylist stringtokenizer


【解决方案1】:

arraylist 中的所有员工都引用了您在开始读取文件之前创建的同一个 e 实例,(它们都共享同一个实例)

你需要改变

Employee e = new Employee();
while ((line = br.readLine()) != null) {

while ((line = br.readLine()) != null) {
    Employee e = new Employee();

为了在将每个 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

【讨论】:

  • 感谢您的建议!我试过这个,但现在它打印了两次名字。所以 ArrayList 中的前两条记录显示为 Betty 和 Sam,第三条和第四条记录显示 bob 和 sally,等等......关于它为什么这样做的任何想法?
【解决方案2】:

您只创建了一次 Employee 对象,在这一行:

Employee e = new Employee();

然后您只是一遍又一遍地为该 Employee 对象分配一个新名称,因此最终该对象具有文件中最后一个员工的名称。您需要为您读入的每个 Employee 创建一个新的 Employee 对象。

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多