kristina7

НП - Календар на Настани

Jan 11th, 2019
654
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.93 KB | None | 0 0
  1. /*
  2. Да се имплементира класа за календар на настани EventCalendar. Секој настан е дефиниран со:
  3.  
  4. име
  5. локација
  6. време (Date).
  7. Класата треба да ги овозможува следните функционалности:
  8.  
  9. public EventCalendar(int year) - конструктор со еден аргумент годината на календарот
  10. public void addEvent(String name, String location, Date date) - додава нов настан зададен со име, локација и време. Ако годината на настанот не се совпаѓа со годината на календарот да се фрли исклучок од вид WrongDateException со порака Wrong date: [date].
  11. public void listEvents(Date date) - ги печати сите настани на одреден датум (ден) подредени според времето на одржување во растечки редослед (ако два настани имаат исто време на одржување, се подредуваат лексикографски според името). Добивањето колекција од настани на одреден датум треба да биде во константно време O(1), а печатењето во линеарно време O(n) (без сортирање, само изминување)! Форматот на печатење настан е dd MMM, YYY HH:mm at [location], [name].
  12. public void listByMonth() - ги печати сите месеци (1-12) со бројот на настани во тој месец.
  13. */
  14.  
  15. import java.text.DateFormat;
  16. import java.text.ParseException;
  17. import java.text.SimpleDateFormat;
  18. import java.util.Comparator;
  19. import java.util.Date;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Scanner;
  23. import java.util.Set;
  24. import java.util.TimeZone;
  25. import java.util.TreeSet;
  26. import java.util.function.Predicate;
  27. import java.util.stream.Collectors;
  28. import java.util.stream.IntStream;
  29.  
  30. class Event implements Comparable<Event> {
  31.     String name, location;
  32.     Date date;
  33.  
  34.     public String getName() {
  35.         return name;
  36.     }
  37.  
  38.     public String getLocation() {
  39.         return location;
  40.     }
  41.  
  42.     public int month() {
  43.         return date.getMonth();
  44.     }
  45.  
  46.     public Date getDate() {
  47.         return date;
  48.     }
  49.  
  50.     public Event(String name, String location, Date date) {
  51.         super();
  52.         this.name = name;
  53.         this.location = location;
  54.         this.date = date;
  55.     }
  56.  
  57.     @Override
  58.     public String toString() {
  59.         DateFormat df = new SimpleDateFormat("dd MMM, yyyy HH:mm");
  60.         return String.format("%s at %s, %s", df.format(date), location, name);
  61.     }
  62.  
  63.     @Override
  64.     public int compareTo(Event e) {
  65.         return Comparator.comparing(Event::getDate).thenComparing(Event::getName).compare(this, e);
  66.     }
  67. }
  68.  
  69. class EventCalendar {
  70.     int year;
  71.     Set<Event> events;
  72.  
  73.     public EventCalendar(int year) {
  74.         TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
  75.         this.year = year - 1900;
  76.         events = new TreeSet<>();
  77.     }
  78.  
  79.     public void addEvent(String name, String location, Date date) throws WrongDateException {
  80.         if (this.year != date.getYear())
  81.             throw new WrongDateException(date);
  82.         events.add(new Event(name, location, date));
  83.     }
  84.  
  85.     public void listEvents(Date date) {
  86.         Predicate<Event> sameDate = event -> (event.date.getMonth() == date.getMonth())
  87.                 && (event.date.getDate() == date.getDate());
  88.         List<Event> lista = events.stream().filter(sameDate).collect(Collectors.toList());
  89.         if (lista.isEmpty())
  90.             System.out.println("No events on this day!");
  91.         else
  92.             lista.forEach(System.out::println);
  93.  
  94.     }
  95.  
  96.     public void listByMonth() {
  97.         Map<Integer, Long> map = events.stream().collect(Collectors.groupingBy(Event::month, Collectors.counting()));
  98.         IntStream.range(0, 12).forEach(i -> {
  99.             System.out.printf("%d : %d\n", i + 1, map.containsKey(i) ? map.get(i).intValue() : 0);
  100.         });
  101.  
  102.     }
  103. }
  104.  
  105. class WrongDateException extends Exception {
  106.     public WrongDateException(Date date) {
  107.         super("Wrong date: " + date);
  108.     }
  109. }
  110.  
  111. public class EventCalendarTest {
  112.     public static void main(String[] args) throws ParseException {
  113.         Scanner scanner = new Scanner(System.in);
  114.         int n = scanner.nextInt();
  115.         scanner.nextLine();
  116.         int year = scanner.nextInt();
  117.         scanner.nextLine();
  118.         EventCalendar eventCalendar = new EventCalendar(year);
  119.         DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm");
  120.         for (int i = 0; i < n; ++i) {
  121.             String line = scanner.nextLine();
  122.             String[] parts = line.split(";");
  123.             String name = parts[0];
  124.             String location = parts[1];
  125.             Date date = df.parse(parts[2]);
  126.             try {
  127.                 eventCalendar.addEvent(name, location, date);
  128.             } catch (WrongDateException e) {
  129.                 System.out.println(e.getMessage());
  130.             }
  131.         }
  132.         Date date = df.parse(scanner.nextLine());
  133.         eventCalendar.listEvents(date);
  134.         eventCalendar.listByMonth();
  135.     }
  136. }
  137.  
  138. // vashiot kod ovde
Advertisement
Add Comment
Please, Sign In to add comment