Advertisement
Filip_Markoski

[NP] Airports

Dec 23rd, 2017
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.12 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class AirportsTest {
  4.     public static void main(String[] args) {
  5.         Scanner scanner = new Scanner(System.in);
  6.         Airports airports = new Airports();
  7.         int n = scanner.nextInt();
  8.         scanner.nextLine();
  9.         String[] codes = new String[n];
  10.         for (int i = 0; i < n; ++i) {
  11.             String al = scanner.nextLine();
  12.             String[] parts = al.split(";");
  13.             airports.addAirport(parts[0], parts[1], parts[2], Integer.parseInt(parts[3]));
  14.             codes[i] = parts[2];
  15.         }
  16.         int nn = scanner.nextInt();
  17.         scanner.nextLine();
  18.         for (int i = 0; i < nn; ++i) {
  19.             String fl = scanner.nextLine();
  20.             String[] parts = fl.split(";");
  21.             airports.addFlights(parts[0], parts[1], Integer.parseInt(parts[2]), Integer.parseInt(parts[3]));
  22.         }
  23.         int f = scanner.nextInt();
  24.         int t = scanner.nextInt();
  25.         String from = codes[f];
  26.         String to = codes[t];
  27.         System.out.printf("===== FLIGHTS FROM %S =====\n", from);
  28.         airports.showFlightsFromAirport(from);
  29.         System.out.printf("===== DIRECT FLIGHTS FROM %S TO %S =====\n", from, to);
  30.         airports.showDirectFlightsFromTo(from, to);
  31.         t += 5;
  32.         t = t % n;
  33.         to = codes[t];
  34.         System.out.printf("===== DIRECT FLIGHTS TO %S =====\n", to);
  35.         airports.showDirectFlightsTo(to);
  36.     }
  37. }
  38.  
  39. class Flight implements Comparable<Flight> {
  40.     String from;
  41.     String to;
  42.     int time;
  43.     int duration;
  44.  
  45.     public Flight(String from, String to, int time, int duration) {
  46.         this.from = from;
  47.         this.to = to;
  48.         this.time = time;
  49.         this.duration = duration;
  50.     }
  51.  
  52.     String startTime() {
  53.         int hours = time / 60;
  54.         int minutes = time % 60;
  55.         return String.format("%02d:%02d", hours, minutes);
  56.     }
  57.  
  58.     String endTime() {
  59.         int hours = (time + duration) / 60;
  60.         int minutes = (time + duration) % 60;
  61.         if (hours >= 24)
  62.             hours -= 24;
  63.         return String.format("%02d:%02d", hours, minutes);
  64.     }
  65.  
  66.     String duration() {
  67.         int startHour = time / 60;
  68.         int startMinute = time % 60;
  69.         int endHour = (time + duration) / 60;
  70.         int endMinute = (time + duration) % 60;
  71.         boolean day = false;
  72.  
  73.         int durMinute = endMinute - startMinute;
  74.         if (endHour >= 24) {
  75.             day = true;
  76.         }
  77.         if (durMinute < 0) {
  78.             durMinute += 60;
  79.             endHour--;
  80.         }
  81.         int durHour = endHour - startHour;
  82.         if (endHour >= 24) {
  83.             day = true;
  84.         }
  85.         if (day)
  86.             return String.format("+1d %dh%02dm", durHour, durMinute);
  87.         else
  88.             return String.format("%dh%02dm", durHour, durMinute);
  89.     }
  90.  
  91.     @Override
  92.     public String toString() {
  93.         return String.format("%s-%s %s-%s %s", from, to, startTime(), endTime(), duration());
  94.     }
  95.  
  96.     @Override
  97.     public int compareTo(Flight that) {
  98.         int difference = this.time - that.time;
  99.         if (difference == 0) {
  100.             return this.from.compareTo(that.from);
  101.         }
  102.         return difference;
  103.     }
  104. }
  105.  
  106. class Airport {
  107.     String name;
  108.     String country;
  109.     String code;
  110.     int passengers;
  111.  
  112.     Map<String, TreeSet<Flight>> flightsTo;
  113.  
  114.     public Airport(String name, String country, String code, int passengers) {
  115.         this.name = name;
  116.         this.country = country;
  117.         this.code = code;
  118.         this.passengers = passengers;
  119.  
  120.         this.flightsTo = new TreeMap<>();
  121.     }
  122.  
  123.     public void addFlight(String to, Flight flight) {
  124.  
  125.         /* This doesn't work */
  126.         /*TreeSet<Flight> flights = flightsTo.computeIfPresent(to, (code, Flights) -> Flights);
  127.         flights.add(flight);
  128.  
  129.         flights = flightsTo.computeIfAbsent(to, code -> new TreeSet<>());
  130.         flights.add(flight);*/
  131.  
  132.         /* Initial Scenario */
  133.         flightsTo.computeIfAbsent(to, key -> {
  134.             TreeSet<Flight> set = new TreeSet<>();
  135.             set.add(flight);
  136.             return set;
  137.         });
  138.  
  139.         /* Running Scenario */
  140.         flightsTo.computeIfPresent(to, (key,value) -> {
  141.             value.add(flight);
  142.             return value;
  143.         });
  144.     }
  145.  
  146.     @Override
  147.     public String toString() {
  148.         return String.format("%s (%s)\n%s\n%d", name, code, country, passengers);
  149.     }
  150. }
  151.  
  152. class Airports {
  153.     /* Code of Airport -> Airport */
  154.     Map<String, Airport> airports;
  155.  
  156.     public Airports() {
  157.         this.airports = new HashMap<>();
  158.     }
  159.  
  160.     public void addAirport(String name, String country, String code, int passengers) {
  161.         //- метод за додавање нов аеродром (име, држава, код и број на патници кои ги превезува годишно)
  162.         Airport airport = new Airport(name, country, code, passengers);
  163.         airports.putIfAbsent(code, airport);
  164.     }
  165.  
  166.     public void addFlights(String from, String to, int time, int duration) {
  167.         /*        - метод за додавање летови
  168.         (код на аеродром за полетување, код на аеродром за слетување,
  169.         време на тргнување во минути поминати од 0:00 часот, времетраење на летот во минути).
  170.  Од аеродром А до аеродром Б може да има повеќе летови.
  171.          */
  172.         /* from & to are codes */
  173.         Flight flight = new Flight(from, to, time, duration);
  174.         airports.get(from).addFlight(to, flight);
  175.     }
  176.  
  177.  
  178.     public void showFlightsFromAirport(String code) {
  179.         /*- метод кои ги прикажува сите летови од аеродромот со код code.
  180.         Прво се печати името на аеродромот (формат во пример излезот),
  181.         потоа се печатат сите летови (формат во пример излезот) подредени
  182.         најпрво лексикографски според кодот на аеродромот дестинација,
  183.         а потоа летовите кон тој аеродром според времето на полетување
  184.         (целосно точна имплементација се смета без повикување на sort методи).*/
  185.  
  186.         Airport airport = airports.get(code);
  187.         System.out.println(airport);
  188.  
  189.         int index = 1;
  190.         for (String from : airport.flightsTo.keySet()) { // all flights starting from the airport
  191.             for (Flight flight : airport.flightsTo.get(from)) {
  192.                 System.out.printf("%d. %s\n", index++, flight);
  193.             }
  194.  
  195.         }
  196.     }
  197.  
  198.     public void showDirectFlightsFromTo(String from, String to) {
  199.         /*
  200.         - метод кој ги прикажува сите директни летови од аеродромот со код from до аеродромот со код to.
  201.          */
  202.         TreeSet<Flight> set = new TreeSet<>(Comparator.comparingInt(flight -> flight.time));
  203.         Airport airport = airports.get(from);
  204.  
  205.         if (airport.flightsTo.get(to) == null) {
  206.             System.out.printf("No flights from %s to %s\n", from, to);
  207.             return;
  208.         }
  209.  
  210.         airport.flightsTo.get(to).stream()
  211.                 .forEach(each -> set.add(each));
  212.  
  213.         set.stream()
  214.                 .forEach(System.out::println);
  215.     }
  216.  
  217.     public void showDirectFlightsTo(String to) {
  218.         /*
  219.         - метод кои ги прикажува сите директни летови до аеродромот со код to.
  220.          */
  221.         TreeSet<Flight> flightsTo = new TreeSet<>();
  222.         airports.values().stream()
  223.                 .filter(each -> each.flightsTo.get(to) != null)
  224.                 .forEach(each -> each.flightsTo.get(to).stream()
  225.                         .forEach(flight -> flightsTo.add(flight)));
  226.  
  227.         flightsTo.stream()
  228.                 .forEach(System.out::println);
  229.     }
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement