我有一个具有如下函数的类:
public void createFlight(String aname, String orig, String dest, String id) {
Flight f = new Flight(aname, orig, dest, id);
boolean found = false;
boolean quit = false;
for (int i = 0; i < flightList.size(); i++) {
//Check origin exist
if (airportList.get(i).getName().equals(orig))
found = true;
if (!found) {
System.out.println("Origin " + orig + " does not exist.");
quit = true;
}
found = false;
//check destination exists
if (airportList.get(i).getName().equals(dest))
found = true;
if (!found) {
System.out.println("Destination " + dest + " does not exist.");
quit = true;
}
//check if origin and destination are the same
if (orig.equals(dest)) {
System.out.println(id + "'s Origin and destination cannot be the same.");
quit = true;
}
}
if (!quit) {
flightList.add(f);
System.out.println("Added flight " + id);
}
}
如果我跑:
s.createFlight("USAIR", "ACE", "YVR", "778");//origin airport does not exist
s.createFlight("BOS", "YHZ", "YUL", "123");
第2行应该正常工作,并且第1行的原始机场不存在。但是我得到了这个:
Added flight 778
Destination YUL does not exist.
哪个输出不正确。我的预期输出会说第一个航班的起源不存在。
答案 0 :(得分:1)
不确定是什么,但循环变量&#34; i&#34;应该从0运行到airPortList.size()我认为。
答案 1 :(得分:1)
在检查原点是否存在之前,您需要在循环开始时将found
重置为false
;否则它可能会在上一次迭代的目的地检查中留下true
的值。
for (int i = 0; i < flightList.size(); i++) {
found = false; // <-- add this
//Check origin exist
if (airportList.get(i).getName().equals(orig))
found = true;
...
按照现在的方式,当在航班列表中进行迭代时,如果存在一个航班的目的地,则其行为就像下一个航班的起源存在一样,无论如何是否确实存在。
然而,这个逻辑总体上有点奇怪,并且一些简化(例如Mohammad's answer)可以使它更清晰,并且更容易诊断这样的问题。此外,如R Kaja Mohideen提到的答案,您可能无法搜索整个机场列表。
答案 2 :(得分:1)
这种简化有帮助吗?你能弄清楚你做错了吗?
public void createFlight(String aname, String orig, String dest, String id) {
Flight f = new Flight(aname, orig, dest, id);
boolean found = false;
boolean quit = false;
for (int i = 0; i < flightList.size(); i++) {
//Check origin exist
if (!airportList.get(i).getName().equals(orig))
{
System.out.println("Origin " + orig + " does not exist.");
quit = true;
}
//check destination exists
if (!airportList.get(i).getName().equals(dest))
{
System.out.println("Destination " + dest + " does not exist.");
quit = true;
}
//check if origin and destination are the same
if (orig.equals(dest)) {
System.out.println(id + "'s Origin and destination cannot be the same.");
quit = true;
}
}
if (!quit) {
flightList.add(f);
System.out.println("Added flight " + id);
}
}
以下是您可以做的事情:
public void createFlight(String aname, String orig, String dest, String id) {
Flight f = new Flight(aname, orig, dest, id);
boolean found = false;
boolean quit = false;
for (int i = 0; i < flightList.size(); i++) {
//Check origin exist
if (!airportList.get(i).getName().equals(orig))
{
System.out.println("Origin " + orig + " does not exist.");
quit = true;
break;
}
//check destination exists
else if (!airportList.get(i).getName().equals(dest))
{
System.out.println("Destination " + dest + " does not exist.");
quit = true;
break;
}
//check if origin and destination are the same
else if (orig.equals(dest)) {
System.out.println(id + "'s Origin and destination cannot be the same.");
quit = true;
break;
}
}
if (!quit) {
flightList.add(f);
System.out.println("Added flight " + id);
}
}
答案 3 :(得分:1)
for loop
正在遍历Flight
中的所有flightList
,而不是Airport
列表中的所有Airport
。
如果flightList
中的Airport
和100 airportList
中有三个航班,则循环中的逻辑只会将提供的航班与前3个机场进行比较而不是全部100个您应该使用airportList
来确定迭代次数,或者更好地将Airport
放在密钥是机场代码的Map<String,Airport>
内。这将消除代码中的许多标志,并使条件更简洁。
Map<String,Airport> airportMap = new HashMap<String,Airport>();
/* Populate map like airportMap.put("BOS", new Airport("BOS",..));*/
public void createFlight(String aname, String orig, String dest, String id) {
if(airportMap.containsKey(orig) && airportMap.containsKey(dest) && !orig.equals(dest)){
Flight f = new Flight(aname, orig, dest, id);
flightList.add(f);
System.out.println("Added flight " + id);
}else if(orig.equals(dest)){
System.out.println(id + "'s Origin and destination cannot be the same.");
}else if(!airportMap.containsKey(orig)){
System.out.println("Origin " + orig + " does not exist.");
}else if(!airportMap.containsKey(dest)){
System.out.println("Destination " + dest + " does not exist.");
}
}