我正在为我的代码寻求帮助。我希望程序从.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
答案 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可能有帮助