Java - 从文本文件中读取问题并将数据保存到对象的ArrayList中

时间:2017-04-17 06:16:35

标签: java

我正在为我的代码寻求帮助。我希望程序从.txt文件中读取并创建一个Animal对象,并根据文件中的数据将其插入到Animal对象的ArrayList中,并假设文件中的数据格式正确。

我创建了一个计数器,以跟踪行号。由于我知道.txt文件中的数据是如何格式化的,因此我可以预测一个Animal对象的开始位置和另一个Animal对象的结束位置。

我不断得到的问题是ArrayList中的动物对象与文本文件中的最后一个Animal具有相同的字段。非常感谢任何和所有帮助。

BufferedReader userInputFile = null;
int ctr = 1;
try {
    userInputFile = new BufferedReader(new FileReader(userDocFilePath));
    Animal newFileAnimal = new Animal();

    while((s = userInputFile.readLine()) != null) {                                                
        if (ctr == 1){
            newFileAnimal.setName(s);
            ctr++;
        } else if (ctr == 2) {
            newFileAnimal.setSpineStatus(s);
            ctr++;
        } else if (ctr == 3) {
            newFileAnimal.setFurStatus(s);
            ctr++;
        } else if (ctr == 4) {
            newFileAnimal.setSwimStatus(s);
            System.out.printf("Animal name: %s\n\tSpine status: %s\n\t"
                + "Fur status: %s\n\tSwim status: %s\n", Animal.getName(), 
                + newFileAnimal.getSpineStatus(), 
                + newFileAnimal.getFurStatus(),
                + newFileAnimal.getSwimStatus());
            array.add(newFileAnimal);
            ctr = 1;
        }
    }

文本文件如下所示:

Rabbit
true
true
true
Duck
true
false
true

2 个答案:

答案 0 :(得分:1)

那是因为您一遍又一遍地重复使用相同的Animal对象。当读入下一只动物时,它的值会被覆盖。最后你得到最后一只动物的值。

该列表包含对同一个Animal对象的n个引用。

要解决此问题,请为每只动物创建一个新对象。

答案 1 :(得分:0)

如果我理解你的问题。你得到的结果是ArrayList:

Duck
true
false
true
Duck
true
false
true

如果是这种情况,那么您需要在while循环中移动Animal对象初始化。

userInputFile = new BufferedReader(new FileReader(userDocFilePath));
Animal newFileAnimal = null;

while((s = userInputFile.readLine()) != null) {    
    newFileAnimal = new Animal();                                            
    if (ctr == 1){
        newFileAnimal.setName(s);
        ctr++;
    } else if (ctr == 2) {
        newFileAnimal.setSpineStatus(s);
        ctr++;
    } else if (ctr == 3) {
        newFileAnimal.setFurStatus(s);
        ctr++;
    } else if (ctr == 4) {
        newFileAnimal.setSwimStatus(s);
        System.out.printf("Animal name: %s\n\tSpine status: %s\n\t"
            + "Fur status: %s\n\tSwim status: %s\n", Animal.getName(), 
            + newFileAnimal.getSpineStatus(), 
            + newFileAnimal.getFurStatus(),
            + newFileAnimal.getSwimStatus());
        array.add(newFileAnimal);
        ctr = 1;
    }
}

编辑:

创建新对象的原因是,ArrayList不是创建新的Object并存储,而是存储对象的引用,因此每次覆盖对象时,所有引用都指向更新Animal对象。

this可能有帮助