2017-04-17 15 views
-1

私のコードで助けを探しています。プログラムが.txtファイルから読み込み、Animalオブジェクトを作成し、ファイル内のデータが正しくフォーマットされていると仮定して、そのファイル内のデータに基づいてAnimalオブジェクトのArrayListに挿入します。Java - テキストファイルからの読み取りとオブジェクトのArrayListへのデータの保存の問題

私は行番号を記録するためにカウンタを作成しました。 .txtファイルのデータがどのように書式設定されているか分かっているため、1つの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; 
     } 
    } 

テキストファイルには、次のようになります。

あなたは何度も何度も同じ Animalオブジェクトを再利用しているためだ
Rabbit 
true 
true 
true 
Duck 
true 
false 
true 
+1

あなたの問題を助けるかもしれないが、あなたが配置しているすべてのオブジェクトで、その結果、動物のインスタンスを1つだけ作成し、常にその1を更新し、ローカル変数「newFileAnimal」を更新しないということです配列は同じAnimalであり、データは最後に配置された情報になります。 – L33T

答えて

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のは、それはあなたがオブジェクトを上書きするたびに、オブジェクトの参照を格納し、ということで、すべての参照更新Animalオブジェクトをポイントします。

this

+0

これは私がもともと考えていたものですが、これがもたらす問題はすべての行に対して新しいAnimalオブジェクトが作成されることです。 –

+0

@tenebris_lumenあなたは、あなたがあなたのファイルから読み込んだ各動物をカプセル化するために別々の 'Animal'オブジェクトを持っています(私は思う)。 –

+0

@tenebris_lumenこれはArrayListでどのように動作するかです。 ArrayListは、新しいオブジェクトを作成するのではなく、そのオブジェクトに格納されているオブジェクトの参照を使用します。だから、すべての動物のための新しいオブジェクトを作成する必要があります。 – Ashyboy

1

。次の動物が読み込まれると値が上書きされます。最後に最後の動物の値が得られます。

リストには、同一のAnimalオブジェクトへのn個の参照が含まれています。

これを解決するには、動物ごとに新しいオブジェクトを作成します。

関連する問題