Java程序不显示来自另一个类的文本(图形)

时间:2014-11-24 21:56:23

标签: java arraylist jgrapht

所以我的飞行课可能有些不对劲,但我无法弄明白究竟是什么。我正在尝试显示航班信息,但是当我运行时只显示机场(尝试爱丁堡 - >多伦多)。这是我的主要课程:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

import org.jgrapht.alg.DijkstraShortestPath;
import org.jgrapht.graph.*;

public class FlightItinerary2
{
    private static ArrayList<String[]> myEdges;
    private static ArrayList<Flight> flight;

    public FlightItinerary2()
    {
    } // ensure non-instantiability.


    @SuppressWarnings("resource")
    public static void main(String [] args)
    {

        // create a graph based on Strings
        myEdges = new ArrayList<String[]>();
        flight = new ArrayList<Flight>();
        SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> hrefGraph = createHrefGraph();

        // note directed edges are printed as: (<v1>,<v2>)
        //printAirports(hrefGraph);
        //System.out.println(hrefGraph.toString());

        Scanner sc = new Scanner(System.in);
        System.out.println("\n Enter 1st airport");
        String startVertex = sc.nextLine();
        while(!hrefGraph.containsVertex(startVertex))
        {
            System.err.println("Please enter an existing airport.");
            startVertex = sc.nextLine();
        }
        System.out.println("Enter 2nd airport");
        String endVertex = sc.nextLine();
        while(!hrefGraph.containsVertex(endVertex))
        {
            System.err.println("Please enter an existing airport.");
            endVertex = sc.nextLine();
        }

        calculatePath(hrefGraph, startVertex, endVertex);

     }

    /**
     * Creates a directed graph based on Strings that represents link
     * structure.
     *
     * @return a graph based on Strings.
     */
    private static SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> createHrefGraph()
    {
        SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> g =
            (SimpleDirectedWeightedGraph<String, DefaultWeightedEdge>) new SimpleDirectedWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class);

        {

            // add the vertices
            g.addVertex("Edinburgh");
            g.addVertex("Heathrow");
            g.addVertex("Amsterdam");
            g.addVertex("Boston");
            g.addVertex("Chicago");
            g.addVertex("Montreal");
            g.addVertex("Toronto");
            g.addVertex("New Delhi");
            g.addVertex("Shanghai");
            g.addVertex("Hong Kong");

            // add edges to create linking structure
            createTwoWayWeightedEdge(g, "Edinburgh", "Heathrow", 110);
            generateFlight("1600", "1800", "BA445", 110);
            generateFlight("0400", "0600", "BA452", 110);
            createTwoWayWeightedEdge(g, "Heathrow", "Amsterdam", 100);
            generateFlight("1400", "1600", "DC123", 100);
            generateFlight("0400", "0600", "AB712", 100);
            createTwoWayWeightedEdge(g, "Heathrow", "Boston", 230);
            generateFlight("1800", "2200", "AD412", 230);
            generateFlight("0900", "1300", "AA413", 230);
            createTwoWayWeightedEdge(g, "Boston", "Chicago", 150);
            generateFlight("0700", "1000", "BA178", 150);
            generateFlight("1300", "1600", "YU712", 150);
            createTwoWayWeightedEdge(g, "Boston", "Montreal", 100);
            generateFlight("1600", "1900", "AG102", 100);
            generateFlight("2100", "2300", "AH140", 100);
            createTwoWayWeightedEdge(g, "Montreal", "Toronto", 90);
            generateFlight("1100", "1200", "AC968", 90);
            generateFlight("2000", "2100", "BA360", 90);
            createTwoWayWeightedEdge(g, "Edinburgh", "Chicago", 560);
            generateFlight("1200", "2000", "BI712", 560);
            generateFlight("2100", "0500", "AX023", 560);
            createTwoWayWeightedEdge(g, "New Delhi", "Shanghai", 430);
            generateFlight("1400", "2000", "AA550", 430);
            generateFlight("0600", "1200", "BB102", 430);
            createTwoWayWeightedEdge(g, "Shanghai", "Hong Kong", 230);
            generateFlight("1400", "1700", "NX450", 230);
            generateFlight("2200", "0100", "BL860", 230);
        } 
        return g;
    }

    private static void createTwoWayWeightedEdge(SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> g, String vertex1, String vertex2, double weight)
    {
        g.addEdge(vertex1, vertex2);
        g.addEdge(vertex2, vertex1);

        g.setEdgeWeight(g.getEdge(vertex1, vertex2), weight);
        g.setEdgeWeight(g.getEdge(vertex2, vertex1), weight);

        String[] tmp1 = {vertex1, vertex2};
        myEdges.add(tmp1);
        String[] tmp2 = {vertex2, vertex1};
        myEdges.add(tmp2);
    }

    private static void generateFlight(String depTime, String arrTime, String flightNo, double price)
    {
        Flight f = new Flight(depTime, arrTime, flightNo, price);
        flight.add(f);
    }

    // for displaying flight info nicely
    private static String textToPrint(String[] format)
    {
        String text = "    ";
        for(int i = 0; i < format.length; i++)
        {
            switch(i)
            {
                case 0:
                    text = text + format[i];
                    for(int j = format[i].length(); j < 6 ; j++)
                        text = text + " ";
                    break;

                case 1:
                    text = text + format[i];
                    for(int j = format[i].length(); j < 15 ; j++)
                        text = text + " ";
                    break;

                case 2:
                    text = text + format[i];
                    for(int j = format[i].length(); j < 10 ; j++)
                        text = text + " ";
                    break;

                case 3:
                    text = text + format[i];
                    for(int j = format[i].length(); j < 10 ; j++)
                        text = text + " ";
                    break;

                case 4:
                    text = text + format[i];
                    for(int j = format[i].length(); j < 15 ; j++)
                        text = text + " ";
                    break;

                case 5:
                    text = text + format[i];
                    for(int j = format[i].length(); j < 10 ; j++)
                        text = text + " ";
                    break;
            }
        }
        return text;
    }


    @SuppressWarnings({ "rawtypes", "unchecked", "unused" })
    private static void calculatePath(SimpleDirectedWeightedGraph<String, DefaultWeightedEdge> g, String startVertex, String endVertex)
    {
        DijkstraShortestPath path = new DijkstraShortestPath(g, startVertex, endVertex);
        path.getPath();
        List<Object> edges = path.getPathEdgeList();

        String item;
        int count = 1;
        double totalDuration = 0;

        if(edges!=null)
        {
            System.out.println("\nShortest ( i . e . cheapest ) path :");
            String[] labels = {"Leg.", "Leave", "At", "On", "Arrive", "At"};
            System.out.println(textToPrint(labels));

            for(Object edge : edges)
            {
                    item = edge.toString();

                    StringTokenizer st = new StringTokenizer(item, ":");

                    String firstAirport = st.nextToken().trim().substring(1);
                    String secondAirport = st.nextToken().trim();
                    secondAirport = secondAirport.substring(0, secondAirport.length()-1);

                    String depTime = null, arrTime = null, flightNo = null;
                    double price, flightDuration;

                    for(int i=0;i<flight.size();i++)
                    {
                        if(firstAirport.equals(myEdges.get(i)[0]) && secondAirport.equals(myEdges.get(i)[1]))
                        {
                            Flight details = flight.get(i);
                            flightNo = details.flightNo;
                            depTime = details.depTime;
                            arrTime = details.arrTime;
                            price = details.price;
                            flightDuration = details.duration;
                            totalDuration = totalDuration + flightDuration;

                            String[] tmp = {count+".", firstAirport, depTime, flightNo, secondAirport, arrTime};
                            System.out.println(textToPrint(tmp));
                        }
                    }
                    count++;

            }
            System.out.println("Cost of shortest (i.e. cheapest) path = £"+path.getPathLength());
            System.out.println("Total time in the air = "+totalDuration+"hrs");
        }
        else
            System.err.println("The path doesn't exist.");
    }

}

和Flight.java类:

public class Flight {

    String depTime;
    String arrTime;
    String flightNo;
    int duration;
    int price;

    public Flight(String depTime, String arrTime, String flightNo, double duration){
        this.depTime = new String();
        this.arrTime = new String();
        this.flightNo = new String();
        //this.duration = this.getDuration();

        }


    public int getDuration(){

        int duration = Integer.parseInt(arrTime) - Integer.parseInt(depTime);
        return duration;
    }

    public String getFlightNo(){
        return flightNo;
    }


    public double getPrice(){
        return price;
    }



}

持续时间也不起作用,但这并不重要。谢谢!

1 个答案:

答案 0 :(得分:1)

这看起来是您不在变量中存储参数的主要问题。相反,你只是初始化它们。将Flight构造函数更改为如下所示。

public Flight(String depTime, String arrTime, String flightNo, double duration){
    this.depTime = depTime;
    this.arrTime = arrTime;
    this.flightNo = flightNo;
    this.duration = duration;
}