我正在尝试解决Mooc.fi练习103,该练习是:为观鸟者设计一个数据库。它包含鸟类的名称和拉丁名称,以及观察到的次数。我在理解以下两个代码为何会导致两个不同答案的过程中遇到问题。
注释掉的代码是我编写的代码。在我输入名称XX之前,一切似乎都工作正常。当我尝试将该名称传递给观察值时,它打印出它不是鸟(有时是两次)(尽管它已添加到arraylist中)。当我尝试输入实际名称时,它运行良好。我在理解为什么for循环中的else子句会导致该问题时遇到问题?上面注释掉的for循环运行得很好,但是我不确定为什么您需要添加一个布尔值以确保它确实在arraylist上?
观察到公共无效(字符串名称){
boolean birdThere = false;
for(Bird bird: this.list) {
if(bird.getName().equals(name) || bird.getLatinName().equals(name)) {
bird.addObservation();
birdThere = true;
}
}
if(!birdThere) {
System.out.println("Is not a bird!");
}
/* //WHY ISN'T THIS WORKING RIGHT???
for(Bird bird: this.list) {
if(bird.getName().equals(name) || bird.getLatinName().equals(name)) {
bird.addObservation();
} else {
System.out.println("Is not a bird!");
}
}
*/
}
当注释掉的for循环以名称“ XX”运行时,它打印“这不是鸟!”
答案 0 :(得分:1)
我猜(因为您没有粘贴完整的代码,只是其中的一部分),问题不在于列表是否包含或不包含名称为XX
的鸟,而是当给定某只鸟时的操作列表中的鸟没有通过if
区块的测试。
让我们看一下原始的for循环代码:当某些鸟没有通过测试时,for循环会做什么?没有。因此,如果list包含名称为[A, B, C]
的鸟,并且我们将XX
传递给该方法,则for循环将无效。但如果任何鸟已被识别为birdThere
,它也会跟踪(XX
标志)。如果不是,则打印一条错误消息(仅一次)。
现在,让我们检查一下新的实现。 For循环打印“不是鸟!”每当有一只鸟没有通过测试时,都会显示一条消息。使用我们的测试列表:[A, B, C]
和XX
参数,由于没有一只鸟通过测试,我们将获得3次此消息。而且,即使有些鸟通过了测试,也不会停止循环,因此所有无效的鸟都会触发错误消息。