2017-04-17 26 views
-1

我正在寻找一些有关我的代码的帮助。我希望程序从.txt文件中读取并创建一个Animal对象,并根据文件中的数据将其插入到Animal对象的ArrayList中,并假定文件中的数据格式正确。Java - 从文本文件读取数据并将数据保存到对象ArrayList中的问题

我创建了一个计数器来跟踪行号。因为我知道.txt文件中的数据是如何格式化的,所以我可以预测一个Animal对象开始的地方,另一个结束。

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

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 
+1

你的问题是,你不更新本地变量“newFileAnimal”,你创建一个动物的只有一个实例,并随时更新这一块,导致所有你配售对象进入数组是相同的动物和数据与最后放置的信息。 – L33T

回答

0

如果我正确理解你的问题。你得到的结果如下ArrayList中:

Duck 
true 
false 
true 
Duck 
true 
false 
true 

如果是这样,那么你就需要移动你的动物对象初始化while循环内部的情况。

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的,而不是创建新的对象和存储,它存储的对象的引用,这样每次覆盖的对象,所有引用指向更新Animal对象。

this可能有助于

+0

这是我最初想到的,然而,这导致的问题是每一行都会创建一个新的Animal对象。 –

+0

@tenebris_lumen你需要一个单独的'Animal'对象来封装你从你的文件中读取的每个动物(我认为)。 –

+0

@tenebris_lumen嗯,这是如何在ArrayList中工作的。 ArrayList使用它存储在其中的对象的引用,而不是创建一个新对象。所以你需要为每个动物创建一个新的对象。 – Ashyboy

1

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

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

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

相关问题