Advertisement
popovstefan

[NP 2 kol.] Kalendar na nastani

Dec 2nd, 2018
549
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.63 KB | None | 0 0
  1. Календар на настани (35 поени) Problem 3 (1 / 26)
  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.  
  16.  
  17. import java.text.DateFormat;
  18. import java.text.ParseException;
  19. import java.text.SimpleDateFormat;
  20. import java.util.Date;
  21. import java.util.HashMap;
  22. import java.util.Scanner;
  23. import java.util.TreeSet;
  24.  
  25. @SuppressWarnings("serial")
  26. class WrongDateException extends RuntimeException {
  27.     public WrongDateException(String msg) {
  28.         super(msg);
  29.     }
  30.     public String getMessage() {
  31.         return super.getMessage();
  32.     }
  33. }
  34.  
  35. class Event implements Comparable<Event>{
  36.     private Date date;
  37.     private String name, location;
  38.     public Event(String name, String location, Date date) {
  39.         this.date = date;
  40.         this.name = name;
  41.         this.location = location;
  42.     }
  43.     public String getName() {
  44.         return this.name;
  45.     }
  46.     public Date getDate() {
  47.         return this.date;
  48.     }
  49.     @Override
  50.     public String toString() {
  51.         DateFormat df = new SimpleDateFormat("dd MMM, YYY HH:mm");
  52.         return String.format("%s at %s, %s", df.format(date), this.location, this.name);
  53.     }
  54.     @Override
  55.     public int compareTo(Event arg0) {
  56.         int w = Long.compare(date.getTime(), arg0.getDate().getTime());
  57.         if (w != 0)
  58.             return w;
  59.         else
  60.             return name.compareTo(arg0.name);
  61.     }
  62. }
  63.  
  64. class EventCalendar {
  65.    
  66.      HashMap<Integer, Integer> monthlyNumbers;
  67.      HashMap<String, TreeSet<Event>> events;
  68.      int year;
  69.        
  70.       EventCalendar(int year) {
  71.             this.year = year;
  72.             monthlyNumbers = new HashMap<>();
  73.             events = new HashMap<>();
  74.         }
  75.         void addEvent(String name, String location, Date date) {
  76.             if (date.getYear() != year - 1900)
  77.                 throw new WrongDateException("Wrong date: " + date.toString().replace("GMT", "UTC"));
  78.             else {
  79.                 monthlyNumbers.computeIfPresent(date.getMonth(), (key, value) -> ++value);
  80.                 monthlyNumbers.putIfAbsent(date.getMonth(), 1);
  81.                
  82.                 String eventKey = String.format("%d %d", date.getDate(), date.getMonth());
  83.                
  84.                 events.putIfAbsent(eventKey, new TreeSet<Event>());
  85.                 events.computeIfPresent(eventKey, (key, value)
  86.                         -> {
  87.                             value.add(new Event(name, location, date));
  88.                             return value;
  89.                         });
  90.             }
  91.         }
  92.        
  93.         void listEvents(Date date) {
  94.             String key = String.format("%d %d", date.getDate(), date.getMonth());
  95.             if (events.get(key) != null)
  96.             events.get(key).stream()
  97.             .forEach(System.out :: println);
  98.             else
  99.                 System.out.println("No events on this day!");
  100.         }
  101.        
  102.         void listByMonth() {
  103.             for (int i = 1; i < 13; i++) {
  104.                 if (monthlyNumbers.get(i - 1) != null)
  105.                     System.out.printf("%d : %d\n", i, monthlyNumbers.get(i - 1));
  106.                 else
  107.                     System.out.printf("%d : %d\n", i, 0);
  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
  139.  
  140. ====================================================================================================================
  141. Sample input
  142. 10
  143. 2013
  144. Taksirat 15;Skopje;28.12.2013 22:00
  145. Rush Premiera;Cineplex;14.02.2013 11:00
  146. Vinoskop;Vero Centar;15.02.2013 21:00
  147. Skopje Gori;Kale;14.04.2013 15:30
  148. Brucoshka Zabava;FINKI;16.04.2014 14:20
  149. Bela Nokj;Skopje;12.06.2013 18:30
  150. Stand Up;Expo Center;15.02.2013 19:30
  151. Cinedays;Kino Milenium;12.01.2013 14:00
  152. Koncert Arhangel;Boris Trajkovski;15.02.2013 19:45
  153. Skopje Jazz Festival;Univerzalna Sala;12.08.2013 22:30
  154. 15.02.2013 00:00
  155. ====================================================================================================================
  156. Sample output
  157. Wrong date: Wed Apr 16 14:20:00 UTC 2014
  158. 15 Feb, 2013 19:30 at Expo Center, Stand Up
  159. 15 Feb, 2013 19:45 at Boris Trajkovski, Koncert Arhangel
  160. 15 Feb, 2013 21:00 at Vero Centar, Vinoskop
  161. 1 : 1
  162. 2 : 4
  163. 3 : 0
  164. 4 : 1
  165. 5 : 0
  166. 6 : 1
  167. 7 : 0
  168. 8 : 1
  169. 9 : 0
  170. 10 : 0
  171. 11 : 0
  172. 12 : 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement