2017-04-17 210 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個引用。

要解決此問題,請爲每隻動物創建一個新對象。

相關問題