2015-11-22 6 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 

この時点で復帰し、次にボストンとトロントになる次のフライトのためにハートをチェックしてください。ボストン・アウトゴーイングのフライトをチェックして、空港がトロントと接続しているかどうかを確認します...

+0

私は新しいsop( "Ankushy")を追加すると、それは日食を使っている間に起こった。私の個人的な方法の1つでは、コンソールには表示されません。まず、新しく追加された行が含まれていない.classファイルを調べてから、プロジェクトをクリーンにして再構築してくれて、私のために働くので、java .classesの作業領域の出力場所を確認するように勧めました。 –

+0

私はこのプロジェクトで使用されたクラスフォルダを完全に削除して、プロジェクトをクリーンアップしました...違いはありませんでした。 : – James

+1

クラスAirportのequalsまたはhash関数をオーバーライドしましたか? –

答えて

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; 
} 

:答えはあなたがデバッグで実行した場合、それはtrueに評価され、働いていた理由の可能性のすべては、あなたが答えを返した場合でも、これはですが、それは私がこれからパス法を持って変更し、実行していることでしたこの目的のために:誰がこの問題を探しているなら、私はあなたのコードの各ブロックで、コンソールに出力を配置し、何が起こっているかによって、次の示唆

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; 
} 

そして、デバッグモードでの実行モデルは、その中には異なっていなければなりません通常の走行。

関連する問題