2015-11-22 51 views
5

当我正在写显示航班信息,波纹管看到一个节目:程序的工作,但不运行

package d.airlineData.engine; 

import java.time.Duration; 
import java.time.LocalTime; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.Map.Entry; 

import a.airlineData.exceptions.NoFlightsException; 
import c.airlineData.exceptions.NoAirportException; 
import d.airlineData.graph.Airport; 
import d.airlineData.graph.Flight; 
import d.airlineData.graph.FlightGraph; 

public class FlightGrapher { 

    private FlightGraph fg; 

    public FlightGrapher() throws NoFlightsException {  
     throw new NoFlightsException(); 
    } 

    public FlightGrapher(ArrayList<Flight> flights) throws NoFlightsException { 
     fg = new FlightGraph(); 

     for(Flight flight: flights) { 
      fg.addAirport(flight.getAirportA()); 
      fg.addAirport(flight.getAirportB()); 

      try { 
       fg.addFlight(flight); 
      } catch (NoAirportException e) { 
       System.err.println(e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void printAll() { 
     HashSet<Airport> airports = fg.getAirports(); 

     for(Airport airport : airports) { 
      System.out.println(airport + ":"); 
      try { 
       Iterator<Flight> it = fg.getFlightsFor(airport); 
       while(it.hasNext()) { 
        System.out.println("\t" + it.next()); 
        System.out.println(); 
       } 

      } catch (NoAirportException e) { 
       System.err.println(e.getMessage() + " while attempting to get flights for " + airport); 
       e.printStackTrace(); 
      } 
     } 

    } 
     public void printItinerary(Airport airportA, Airport airportB) { 
    System.out.println("Leg\tLeave\t\tAt\tOn\tArrive\tAt"); 
    printItinerary(airportA,airportB, 1, 0.0, Duration.ofHours(0)); 
} 

private void printItinerary(Airport airportA, Airport airportB, int leg, double totalPrice, Duration totalDuration) { 
    Iterator<Flight> aFlights = airportA.getOutgoingFlights(); 
    System.err.println("Enters method printItinerary"); 
    System.err.println("airportA " + airportA); 
    System.err.println("airportB " + airportB); 
    System.err.println("leg " + leg); 
    System.err.println("total price " + totalPrice); 
    System.err.println("Duration " + totalDuration.toMinutes() + "mins"); 
    System.err.println(); 
    while(aFlights.hasNext()) { 

     Flight currentFlight = aFlights.next(); 
     System.err.println("Enters while of printItinerary currentFlight: "); 
     System.err.println(currentFlight); 
     if(currentFlight.getAirportB().equals(airportB)) { 

      System.out.println(leg + "\t" + 
        currentFlight.getAirportA() + "\t" + 
        currentFlight.getDepartureTime() + "\t" + 
        currentFlight.getFlightNumber() + "\t" + 
        currentFlight.getAirportB() + "\t" + 
        currentFlight.getArrivalTime()); 

      System.out.println(); 
      System.out.println("Total journey costs\t= £" + (currentFlight.getPrice() + totalPrice)); 
      System.out.println("Total time in air\t= " + (currentFlight.getFlightDuration().plus(totalDuration))); 

      return; 

     }else { 
      System.err.println("enters else " + "currentFlight " + currentFlight.getAirportB() + " airport B " + airportB); 
      System.err.println(); 
      if(hasAPath(currentFlight.getAirportB(), airportB)) { 
       System.out.println(leg + "\t" + 
         currentFlight.getAirportA() + "\t" + 
         currentFlight.getDepartureTime() + "\t" + 
         currentFlight.getFlightNumber() + "\t" + 
         currentFlight.getAirportB() + "\t" + 
         currentFlight.getArrivalTime()); 

       printItinerary(currentFlight.getAirportB(), airportB, leg + 1, 
         (currentFlight.getPrice() + totalPrice), 
         (currentFlight.getFlightDuration().plus(totalDuration))); 
      } 
     } 
    }  
} 

private boolean hasAPath(Airport airportA, Airport airportB) { 
    System.err.println("Enters hasAPath with airportA " + airportA + " airportB " + airportB); 
    Iterator<Flight> aFlights = airportA.getOutgoingFlights(); 
    while(aFlights.hasNext()) { 
     Flight currentFlight = aFlights.next(); 
     System.err.println("Enters while of hasAPath currentFlight: "); 
     System.err.println(currentFlight); 
     if(currentFlight.getAirportB().equals(airportB)) { 
      System.err.println("returns true for airportA " + airportA + " airportB " + airportB); 
      return true;    
     }else { 
      System.err.println("Calls hasAPath with airportA " + currentFlight.getAirportB() + " airportB " + airportB); 
      return hasAPath(currentFlight.getAirportB(), airportB); 
     } 

    } 
    System.err.println("returns false for airportA " + airportA + " airportB " + airportB); 
    return false; 
} 

    public static void main(String[] args) { 
     ArrayList<Flight> flights = new ArrayList<>(); 
     HashMap<String, Airport> airports = new HashMap<>(); 

     airports.put("Edinburgh", new Airport("Edinburgh")); 
     airports.put("Heathrow", new Airport("Heathrow")); 
     airports.put("Amsterdam", new Airport("Amsterdam")); 
     airports.put("Boston", new Airport("Boston")); 
     airports.put("Montreal", new Airport("Montreal")); 
     airports.put("Chicago", new Airport("Chicago")); 
     airports.put("Toronto", new Airport("Toronto")); 
     airports.put("New Delhi", new Airport("New Delhi")); 
     airports.put("Shanghai", new Airport("Shanghai")); 
     airports.put("Hong Kong", new Airport("Hong Kong")); 

     flights.add(new Flight(airports.get("Edinburgh"),airports.get("Heathrow"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 110.0)); 

     flights.add(new Flight(airports.get("Heathrow"),airports.get("Amsterdam"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 100.0)); 

     flights.add(new Flight(airports.get("Heathrow"),airports.get("Boston"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 230.0)); 

     flights.add(new Flight(airports.get("Boston"),airports.get("Chicago"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 150.0)); 

     flights.add(new Flight(airports.get("Boston"),airports.get("Montreal"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 100.0)); 

     flights.add(new Flight(airports.get("Montreal"),airports.get("Toronto"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 90.0)); 

     flights.add(new Flight(airports.get("Edinburgh"),airports.get("Chicago"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 560.0)); 

     flights.add(new Flight(airports.get("New Delhi"),airports.get("Shanghai"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 430.0)); 

     flights.add(new Flight(airports.get("Shanghai"),airports.get("Hong Kong"), 
       "B7982",LocalTime.of(22,10),LocalTime.of(23,15), 230.0)); 


     Iterator<Entry<String,Airport>> airportIt = airports.entrySet().iterator(); 

     while(airportIt.hasNext()) { 
      Entry<String, Airport> pair = airportIt.next(); 
      Airport airport = pair.getValue(); 
      for(Flight flight: flights) { 
       if(flight.getAirportA().equals(airport)) { 
        airport.addOutgoingFlight(flight); 
       } 
      } 
     } 

     try { 
      FlightGrapher fg = new FlightGrapher(flights); 
      //fg.printAll(); 
      fg.printItinerary(airports.get("Edinburgh"), airports.get("Toronto")); // steps into this method 
     } catch (NoFlightsException e) { 
      System.err.println(e.getMessage() + " when trying to make a flight between a nonexistant airport"); 
      e.printStackTrace(); 
     } 

    } 

} 

我有使用该方法时的问题:

printItinerary(Airport airportA, Airport airportB, int leg, double totalPrice, Duration totalDuration) 

它在正常运行时不会执行某些原因,但是当我使用调试器执行程序时,一切都会正常执行,并且我得到一个有意义的输出(格式不是很好,但我可以使用),为什么是这样发生了什么?

输出应该是这样的:

Leg Leave  At On Arrive At 
1  Edinburgh 10:30 BA345 Heathrow 11:30 
2  Heathrow 14:00 BA657 Boston 15:30 
3  Boston  18:00 AA652 Montreal 19:30 
4  Montreal 22:00 AA216 Toronto 23:30 

Total Journey Cost = £530 
Total Time in the Air = 4 hrs 20 min 

我得到这个,当我刚刚运行正常:

Leg Leave  At On Arrive At 

,这时候,我一步,但(或调试运行):

Leg  Leave   At  On  Arrive  At 
1  Edinburgh  22:10 B7982 Heathrow   23:15 
2  Heathrow  22:10 B7982 Boston  23:15 
3  Boston 22:10 B7982 Montreal   23:15 
4  Montreal  22:10 B7982 Toronto  23:15 

Total journey costs = £530.0 
Total time in air = PT4H20M 

步进虽然部分是我想要输出的(我将在后面的格式工作)

eddit:我添加了一堆的输出上的错误流,这里是输出当我运行它...出于某种原因停止在“hasAPath”的方法:

Leg Leave  At On Arrive At 
Enters method printItinerary 
airportA Edinburgh 
airportB Toronto 
leg 1 
total price 0.0 
Duration 0mins 

Enters while of printItinerary currentFlight: 
Flight between Edinburgh & Chicago: 
     For: £560.0 
     Flight Number: B7982 
     Leaves at: 22:10 
     Arrives at: 23:15 
     Duration: 1hr 5min 
enters else currentFlight Chicago airport B Toronto 

Enters hasAPath with airportA Chicago airportB Toronto 
returns false for airportA Chicago airportB Toronto 
Enters while of printItinerary currentFlight: 
Flight between Edinburgh & Heathrow: 
     For: £110.0 
     Flight Number: B7982 
     Leaves at: 22:10 
     Arrives at: 23:15 
     Duration: 1hr 5min 
enters else currentFlight Heathrow airport B Toronto 

Enters hasAPath with airportA Heathrow airportB Toronto 
Enters while of hasAPath currentFlight: 
Flight between Heathrow & Amsterdam: 
     For: £100.0 
     Flight Number: B7982 
     Leaves at: 22:10 
     Arrives at: 23:15 
     Duration: 1hr 5min 
Calls hasAPath with airportA Amsterdam airportB Toronto 
Enters hasAPath with airportA Amsterdam airportB Toronto 
returns false for airportA Amsterdam airportB Toronto 

在这一点它应该返回,然后检查hasAPath为下一个航班,这将是波士顿和多伦多,然后将检查所有Bostons出行航班,看看他们的机场是否与多伦多有连接...等等

+0

它发生在我身上,而使用eclipse时,当我添加新的sop(“Ankushy”);在我的私人方法之一,它不在控制台上打印。首先,我查看了不包含新增行的.class文件,然后清理并重建项目,并为我工作,我建议您检查java .classes的工作空间输出位置。 –

+0

我完全删除了这个项目中使用的类文件夹,然后去清理项目...没有什么区别。 :( – James

+1

您是否覆盖了equals或机场类的哈希函数? –

回答

1

问题解决了。答案是,当你在调试运行它运行,虽然所有的可能性,即使你返回答案,这就是为什么它评估为真而工作,我改变了具有这种路径方法:

private boolean hasAPath(Airport airportA, Airport airportB) { 
    Iterator<Flight> aFlights = airportA.getOutgoingFlights(); 
    while(aFlights.hasNext()) { 
     Flight currentFlight = aFlights.next(); 
     if(currentFlight.getAirportB().equals(airportB)) {   
      return true;    
     }else {    
      return hasAPath(currentFlight.getAirportB(), airportB); 
     } 

    } 

    return false; 
} 

要这样:

private boolean hasAPath(Airport airportA, Airport airportB) { 
    Iterator<Flight> aFlights = airportA.getOutgoingFlights(); 
    while(aFlights.hasNext()) { 
     Flight currentFlight = aFlights.next(); 
     if(currentFlight.getAirportB().equals(airportB)) {    
      return true;    
     }else { 
      if(hasAPath(currentFlight.getAirportB(), airportB)) { 
       return true; 
      }else { 
       continue; 
      } 
     } 

    } 
    return false; 
} 

如果任何人在寻找这个问题,那么我建议你的代码的每个块将输出到控制台,并通过所发生的事情之后,在调试模式下执行模型必须来自不同正常运行。

相关问题