如果满足条件,则打印数组列表的选择部分

时间:2015-04-13 20:17:16

标签: java arraylist printing

我正在编写一个程序,允许用户将狗检查到狗窝中,并且我在打印所有喜欢骨骼的狗时遇到一些麻烦(当你添加狗时,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

先谢谢大家。

1 个答案:

答案 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());
}