我正在编写一个程序,允许用户将狗检查到狗窝中,并且我在打印所有喜欢骨骼的狗时遇到一些麻烦(当你添加狗时,arraylist中的标准之一)。当您从主控制台菜单中选择“打印所有喜欢骨头的狗”选项时,我正在尝试打印出该名称,但是它会打印出阵列列表中的所有信息。
这是当前的代码:
private void printDogsWithBones() {
Dog[] dogsWithBones = kennel.obtainDogsWhoLikeBones();
System.out.println("Dogs with bones: ");
for (Dog d: dogsWithBones){
System.out.println(d);
}
}
public Dog[] obtainDogsWhoLikeBones() {
// TODO
// Prints "null" if a dog is in the array that doesn't like bones.
Dog[] tempResult = new Dog[dogs.size()];
// Sets the int tempResult to -1 to allow for scanning through the array from position 0, making sure every dog is accounted for.
int tempCount = -1;
// For each loop to scan through the array and check for each dog that likes bones
for (Dog t : dogs){
// Adds 1 to tempCount to enable efficient and functional scanning through the array
tempCount++;
// Adds the animal from the array to the temp Array which will then be printed back in KennelDemo
if(t.getLikesBones() == true){
tempResult[tempCount] = t;
}
}
return tempResult;
}
我遇到的另一个问题是如果狗不喜欢骨头,它会打印出“空”而不是任何东西。
以下是运行该方法时控制台打印出来的内容:
1 - add a new Dog
2 - set up Kennel name
3 - print all dogs who like bones
4 - search for a dog
5 - remove a dog
6 - set kennel capacity
q - Quit
What would you like to do:
3
Dogs with bones:
null
Dog name:RoverLikes Bones?:trueOriginal Owner:[David 98765]Favfood:NipplesFoodPerDay:3
Dog name:IzzyLikes Bones?:trueOriginal Owner:[Jay 123456789]Favfood:CurryFoodPerDay:3
先谢谢大家。
答案 0 :(得分:1)
那是因为你在你的tempResult数组中跳过数组索引,其中狗不喜欢骨头。即使狗不喜欢骨骼,你也会增加tempCount,因此会跳过当前值。要修复,请在if语句中移动tempCount增量。
if(t.getLikesBones() == true){
tempCount++;
tempResult[tempCount] = t;
}
此外,由于t.getLikesBones()将评估为true,因此您不需要== true。您还可以在数组索引上使用前缀增量,但这可能会降低可读性。
if(t.getLikesBones()){
tempResult[++tempCount] = t;
}
使用数组时,如果您不知道它在创建时的大小,通常会建议您使用列表。这将为您动态调整大小。如果你想转换回一个很好的数组,但是列表而不是数组可能更适合你的整个应用程序
public Dog[] obtainDogsWhoLikeBones() {
// Initialise dogsWhoLikeBones list
ArrayList<Dog> dogsWhoLikeBones = new ArrayList<Dog>();
// Iterate through dogs
for (Dog dog : dogs){
if(dog.getLikesBones()){
// If a dog likes bones, add them to the list
dogsWhoLikeBones.add(dog);
}
}
// Get size of list to set the size of the return array
int listSize = dogsWhoLikeBones.size();
// Convert dogs list back to an array
return dogsWhoLikeBones.toArray(new Dog[listSize]);
}
要打印出狗的名字而不是java试图将你的对象变成一个字符串,在你的打印循环中你需要得到它的名字。你的狗类中有一个访问器(例如getName)吗?如果是这样,你可以这样做:
for (Dog d: dogsWithBones){
System.out.println(d.getName());
}