Filip_Markoski

[NP] Event Calendar [Calendar]

Dec 25th, 2017
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.24 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.Collectors;
  6. import java.util.stream.IntStream;
  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 Event implements Comparable<Event> {
  36.     String name;
  37.     String location;
  38.     Date date;
  39.  
  40.     public String getName() {
  41.         return name;
  42.     }
  43.  
  44.     public String getLocation() {
  45.         return location;
  46.     }
  47.  
  48.     public Date getDate() {
  49.         return date;
  50.     }
  51.  
  52.     public Event(String name, String location, Date date) {
  53.         this.name = name;
  54.         this.location = location;
  55.         this.date = date;
  56.     }
  57.  
  58.     @Override
  59.     public String toString() {
  60.         /*        Форматот на печатење настан е dd MMM, YYY HH:mm at [location], [name].         */
  61.         DateFormat dateFormat = new SimpleDateFormat("dd MMM, YYY HH:mm");
  62.         return String.format("%s at %s, %s", dateFormat.format(date), location, name);
  63.     }
  64.  
  65.     public static final Comparator<Event> EVENT_COMPARATOR =
  66.             Comparator.comparing(Event::getDate).thenComparing(Event::getName);
  67.  
  68.     @Override
  69.     public int compareTo(Event that) {
  70.         return EVENT_COMPARATOR.compare(this, that);
  71.     }
  72.  
  73.     public int getMonth() {
  74.         Calendar calendar = Calendar.getInstance();
  75.         calendar.setTime(date);
  76.         return calendar.get(Calendar.MONTH) + 1;
  77.     }
  78. }
  79.  
  80. class WrongDateException extends Exception {
  81.     public WrongDateException(Date date) {
  82.         super(String.format("Wrong date: %s", date).replaceAll("CET|GMT", "UTC"));
  83.     }
  84. }
  85.  
  86. class EventCalendar {
  87.     int year;
  88.     /* Date -> Events on that date */
  89.     Map<Date, Set<Event>> events;
  90.  
  91.     public EventCalendar(int year) {
  92.         this.year = year;
  93.         events = new TreeMap<>();
  94.     }
  95.  
  96.     public void addEvent(String name, String location, Date date) throws WrongDateException {
  97.  
  98.         Calendar calendar = Calendar.getInstance();
  99.         calendar.setTime(date);
  100.  
  101.         if (calendar.getWeekYear() != year) throw new WrongDateException(date);
  102.  
  103.         calendar.set(Calendar.HOUR_OF_DAY, 0);
  104.         calendar.set(Calendar.MINUTE, 0);
  105.         calendar.set(Calendar.SECOND, 0);
  106.         calendar.set(Calendar.MILLISECOND, 0);
  107.  
  108.         Event event = new Event(name, location, date);
  109.  
  110.         events.computeIfAbsent(calendar.getTime(), dateAsKey -> new TreeSet<>()).add(event);
  111.     }
  112.  
  113.     public void listEvents(Date date) {
  114.         //ги печати сите настани на одреден датум (ден)
  115.         Optional.ofNullable(events.get(date)).ifPresent(set -> set.stream().forEach(System.out::println));
  116.         System.out.print(!Optional.ofNullable(events.get(date)).isPresent() ? "No events on this day!\n" : "");
  117.     }
  118.  
  119.     public void listByMonth() {
  120.         Map<Integer, Long> collected = events.values().stream()
  121.                 .flatMap(set -> set.stream())
  122.                 .collect(Collectors.groupingBy(Event::getMonth, Collectors.counting()));
  123.         IntStream.rangeClosed(1, 12).forEach(i -> collected.computeIfAbsent(i, integer -> 0L));
  124.         String stringCollected = collected.entrySet().stream()
  125.                 .map(entry -> entry.getKey().toString() + " : " + entry.getValue().toString())
  126.                 .collect(Collectors.joining("\n"));
  127.         System.out.println(stringCollected);
  128.     }
  129. }
  130. /*
  131. public void listEvents(Date date) - ги печати сите настани на одреден датум (ден) подредени според времето на одржување во растечки редослед (ако два настани имаат исто време на одржување, се подредуваат лексикографски според името). Добивањето колекција од настани на одреден датум треба да биде во константно време O(1), а печатењето во линеарно време O(n) (без сортирање, само изминување)! Форматот на печатење настан е dd MMM, YYY HH:mm at [location], [name].
  132. public void listByMonth() - ги печати сите месеци (1-12) со бројот на настани во тој месец.
  133.  */
Advertisement
Add Comment
Please, Sign In to add comment