Filip_Markoski

[NP] Event Calendar

Dec 24th, 2017
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.57 KB | None | 0 0
  1. import java.text.DateFormat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.*;
  5. import java.util.stream.Collector;
  6. import java.util.stream.Collectors;
  7.  
  8. public class EventCalendarTest {
  9.     public static void main(String[] args) throws ParseException {
  10.         Scanner scanner = new Scanner(System.in);
  11.         int n = scanner.nextInt();
  12.         scanner.nextLine();
  13.         int year = scanner.nextInt();
  14.         scanner.nextLine();
  15.         EventCalendar eventCalendar = new EventCalendar(year);
  16.         DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm");
  17.         for (int i = 0; i < n; ++i) {
  18.             String line = scanner.nextLine();
  19.             String[] parts = line.split(";");
  20.             String name = parts[0];
  21.             String location = parts[1];
  22.             Date date = df.parse(parts[2]);
  23.             try {
  24.                 eventCalendar.addEvent(name, location, date);
  25.             } catch (WrongDateException e) {
  26.                 System.out.println(e.getMessage());
  27.             }
  28.         }
  29.         Date date = df.parse(scanner.nextLine());
  30.         eventCalendar.listEvents(date);
  31.         eventCalendar.listByMonth();
  32.     }
  33. }
  34.  
  35. class WrongDateException extends Exception {
  36.     public WrongDateException(Date date) {
  37.         super(String.format("Wrong date: %s", date.toString().replaceAll("GMT", "UTC")));
  38.     }
  39. }
  40.  
  41. class Event implements Comparable<Event> {
  42.     String name;
  43.     String location;
  44.     Date date;
  45.  
  46.     public String getName() {
  47.         return name;
  48.     }
  49.  
  50.     public String getLocation() {
  51.         return location;
  52.     }
  53.  
  54.     public Date getDate() {
  55.         return date;
  56.     }
  57.  
  58.     public Event(String name, String location, Date date) {
  59.         this.name = name;
  60.         this.location = location;
  61.         this.date = date;
  62.     }
  63.  
  64.     @Override
  65.     public String toString() {
  66.         SimpleDateFormat sdf = new SimpleDateFormat("dd MMM, YYY HH:mm");
  67.         return String.format("%s at %s, %s", sdf.format(date), location, name);
  68.     }
  69.  
  70.     @Override
  71.     public int compareTo(Event that) {
  72.         return Comparator.comparing(Event::getDate)
  73.                 .thenComparing(Event::getName)
  74.                 .compare(this, that);
  75.     }
  76. }
  77.  
  78. class EventCalendar {
  79.     int year;
  80.     /* String of Date of Event -> Event */
  81.     Map<String, TreeSet<Event>> events;
  82.     Map<Date, TreeSet<Event>> eventsDate;
  83.  
  84.     Map<Integer, Integer> monthlyEvents;
  85.  
  86.     public EventCalendar(int year) {
  87.         this.year = year;
  88.         events = new HashMap<>();
  89.         eventsDate = new HashMap<>();
  90.         monthlyEvents = new HashMap<>();
  91.     }
  92.  
  93.     public static final Comparator<Event> EVENT_COMPARATOR = Comparator.comparing(Event::getDate).thenComparing(Event::getName);
  94.  
  95.     public static final int STARTING_YEAR = 1900;
  96.     public static final DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm");
  97.  
  98.     public void addEvent(String name, String location, Date date) throws WrongDateException {
  99.         if (date.getYear() != year - STARTING_YEAR) throw new WrongDateException(date);
  100.  
  101.         Event event = new Event(name, location, date);
  102.  
  103.         String time = String.format("%d %d", date.getDate(), date.getMonth());
  104.  
  105.  
  106.         monthlyEvents.computeIfPresent(date.getMonth(), (key, value) -> ++value);
  107.         monthlyEvents.putIfAbsent(date.getMonth(), 1);
  108.  
  109.         events.computeIfPresent(time, (day, set) -> {
  110.             set.add(event);
  111.             return set;
  112.         });
  113.  
  114.         events.computeIfAbsent(time, day -> {
  115.             TreeSet<Event> set = new TreeSet<>();
  116.             set.add(event);
  117.             return set;
  118.         });
  119.  
  120.         eventsDate.computeIfPresent(date, (day, set) -> {
  121.             set.add(event);
  122.             return set;
  123.         });
  124.  
  125.         eventsDate.computeIfAbsent(date, day -> {
  126.             TreeSet<Event> set = new TreeSet<>();
  127.             set.add(event);
  128.             return set;
  129.         });
  130.  
  131.     }
  132.  
  133.  
  134.     public void listEvents(Date date) {
  135.         /*System.out.println("Date: " + date);
  136.         System.out.println(events);*/
  137.         String time = String.format("%d %d", date.getDate(), date.getMonth());
  138.         TreeSet<Event> specific = events.get(time);
  139.         if (specific == null) {
  140.             System.out.println("No events on this day!");
  141.         } else {
  142.             specific.stream()
  143.                     .forEach(System.out::println);
  144.         }
  145.  
  146.         /*System.out.println("====================");
  147.  
  148.         System.out.println(eventsDate);
  149.         System.out.println(eventsDate.get(date));
  150.         eventsDate.entrySet().stream()
  151.                 .filter(entry -> entry.getKey().getDay() == date.getDay())
  152.                 .forEach(System.out::println);*/
  153.         /*
  154.         events.get(time).stream()
  155.                 .forEach(event -> System.out.println(event == null ? "No events on this day!" : event));
  156.          */
  157.     }
  158.  
  159.     public void listByMonth() {
  160.         for (int i = 0; i < 12; ++i) {
  161.  
  162.             if (monthlyEvents.containsKey(i))
  163.                 System.out.printf("%d : %d\n", i + 1, monthlyEvents.get(i));
  164.             else
  165.                 System.out.printf("%d : %d\n", i + 1, 0);
  166.  
  167.         }
  168.  
  169.         /*Map<Integer, TreeSet<Event>> collect = eventsDate.entrySet().stream()
  170.                 .collect(Collectors.toMap(
  171.                         entry -> entry.getKey().getMonth(),
  172.                         entry -> entry.getValue(),
  173.                         (firstSet, secondSet) -> {
  174.                             firstSet.addAll(secondSet);
  175.                             return firstSet;
  176.                         }
  177.                         )
  178.                 );
  179.  
  180.         collect.values().stream()
  181.                 .forEach(System.out::println);*/
  182.  
  183.  
  184.     }
  185. }
  186. /*
  187.  
  188.  
  189.  
  190. public void listEvents(Date date) - ги печати сите настани на одреден датум (ден) подредени според времето на одржување во растечки редослед (ако два настани имаат исто време на одржување, се подредуваат лексикографски според името). Добивањето колекција од настани на одреден датум треба да биде во константно време O(1), а печатењето во линеарно време O(n) (без сортирање, само изминување)! Форматот на печатење настан е dd MMM, YYY HH:mm at [location], [name].
  191. public void listByMonth() - ги печати сите месеци (1-12) со бројот на настани во тој месец.
  192.  */
  193.  
  194. // ========================================
  195. // ========================================
  196. // ========================================
  197.  
  198.  
  199. /*
  200. *
  201. Да се имплементира класа за календар на настани EventCalendar. Секој настан е дефиниран со:
  202.  
  203. име
  204. локација
  205. време (Date).
  206. Класата треба да ги овозможува следните функционалности:
  207.  
  208. public EventCalendar(int year) - конструктор со еден аргумент годината на календарот
  209.  
  210. public void addEvent(String name, String location, Date date) - додава нов настан зададен со име, локација и време.
  211. Ако годината на настанот не се совпаѓа со годината на календарот
  212. да се фрли исклучок од вид WrongDateException со порака Wrong date: [date].
  213.  
  214. */
Advertisement
Add Comment
Please, Sign In to add comment