Advertisement
Nikolovska

[НП] лаб4.2 Генерички распоредувач

Jun 4th, 2018
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.67 KB | None | 0 0
  1. /*Генеричко програмирање (4)
  2.  
  3. Генерички распоредувач Problem 2 (0 / 0)
  4.  
  5. Треба да се развие класа Timestamp која претставува пар на објекти од кои едниот е секогаш од тип LocalDateTime, а
  6. другиот објект е од генеричкиот тип T. Класата Timestamp ги нуди следниве функционалности:
  7.  
  8. Timestamp(LocalDateTime time, T element) - конструктор
  9. getTime():LocalDateTime
  10. getElement():T
  11. compareTo(Timestamp<?> t):int - споредувањето се прави само врз основа на времињата
  12. equals(Object o):boolean - враќа true ако се исти и времињата и елементот
  13. toString() :String - враќа стринг репрезентација со времето (toString) и елементот во формат time element
  14. Забелешка: двете променливи time и element мора да бидат обележани како final.
  15.  
  16. Класата Timestamp сега треба да се искористи за да се развие класа Scheduler. Оваа класа чува повеќе објекти од класата
  17. Timestamp и исто така има еден генерички параметар T кој всушност се однесува на типот на објект кој се наоѓа во
  18. Timestamp. Класата Scheduler треба да ги имплементира следниве методи:
  19.  
  20. Scheduler() - креира нов празен распоредувач
  21. add(Timestamp<T> t) - додава нов објект во распоредувачот
  22. remove(Timestamp<T> t):boolean - го брише соодветниот елемент од распоредувачот доколку постои и враќа true, во
  23. спротивно враќа false
  24. next():Timestamp<T> - го враќа следниот Timestamp објект, односно тој објект чие што време е најблиску до тековното
  25. (сега) и сѐ уште НЕ е поминато
  26. last():Timestamp<T> - го враќа објектот кој има време најблиску до тековното (сега) и веќе E поминат
  27. getAll(LocalDateTime begin, LocalDateTime end):List<Timestamp<T>> - враќа листа на настани чии времиња се наоѓаат помеѓу
  28. begin и end (не вклучувајќи ги begin и end).
  29.  
  30. Sample input
  31. 0 test
  32.  
  33. Sample output
  34. 2016-10-25T10:15 test
  35. 2016-10-25T10:15
  36. test
  37. */
  38.  
  39. import java.time.Instant;
  40. import java.time.LocalDateTime;
  41. import java.time.ZoneId;
  42. import java.util.ArrayList;
  43. import java.util.Collections;
  44. import java.util.List;
  45. import java.util.Scanner;
  46. import java.util.stream.Collectors;
  47. import java.util.Comparator;
  48.  
  49. class Timestamp<T> implements Comparable<Timestamp<?>>{
  50.     private final LocalDateTime time;
  51.     private final T element;
  52.  
  53.     public Timestamp(LocalDateTime time, T element) {
  54.         this.time = time;
  55.         this.element = element;
  56.     }
  57.  
  58.     public LocalDateTime getTime() {
  59.         return time;
  60.     }
  61.  
  62.     public T getElement() {
  63.         return element;
  64.     }
  65.  
  66.     @Override
  67.     public int compareTo(Timestamp<?> o) {
  68.         return this.time.compareTo(o.time);
  69.     }
  70.  
  71.     @Override
  72.     public boolean equals(Object obj) {
  73.         /*if (this == obj)
  74.             return true;
  75.         if (obj == null)
  76.             return false;
  77.         if (getClass() != obj.getClass())
  78.             return false;
  79.  
  80.         Timestamp other = (Timestamp)obj;
  81.         if (!time.equals(other.time))
  82.             return false;
  83.         if (element != other.element)
  84.             return false;
  85.         return true;*/
  86.         Timestamp other = (Timestamp)obj;
  87.         return this.time.equals(other.time);
  88.     }
  89.  
  90.     @Override
  91.     public String toString() {
  92.         return time + " " + element;
  93.     }
  94. }
  95.  
  96. class Scheduler<T> {
  97.     private ArrayList<Timestamp<T>> timestamps;
  98.  
  99.     public Scheduler() {
  100.         timestamps = new ArrayList<Timestamp<T>>();
  101.     }
  102.  
  103.     public void add(Timestamp<T> t){
  104.         timestamps.add(t);
  105.     }
  106.  
  107.     public boolean remove(Timestamp<T> t){
  108.         if (!timestamps.contains(t))
  109.             return false;
  110.         timestamps.remove(t);
  111.         return true;
  112.     }
  113.  
  114.     public Timestamp<T> next(){
  115.         LocalDateTime now = LocalDateTime.now();
  116.         LocalDateTime next = LocalDateTime.MAX;
  117.         T elem = null;
  118.         for(int i=0; i<timestamps.size(); i++){
  119.             LocalDateTime current = timestamps.get(i).getTime();
  120.             if (now.isBefore(current) && current.isBefore(next)){
  121.                     next = current;
  122.                     elem = timestamps.get(i).getElement();
  123.             }
  124.         }
  125.         return new Timestamp<>(next,elem);
  126.     }
  127.  
  128.     public Timestamp<T> last(){
  129.         LocalDateTime now = LocalDateTime.now();
  130.         LocalDateTime last = LocalDateTime.MIN;
  131.         T elem = null;
  132.         for (int i=0; i<timestamps.size(); i++){
  133.             LocalDateTime current = timestamps.get(i).getTime();
  134.             if (current.isBefore(now) && current.isAfter(last)){
  135.                 last = timestamps.get(i).getTime();
  136.                 elem = timestamps.get(i).getElement();
  137.             }
  138.         }
  139.         return new Timestamp<>(last,elem);
  140.     }
  141.  
  142.     public List<Timestamp<T>> getAll(LocalDateTime begin, LocalDateTime end){
  143.         List<Timestamp<T>> temp = new ArrayList<Timestamp<T>>();
  144.         LocalDateTime current;
  145.         for (int i=0; i<timestamps.size(); i++){
  146.             current = timestamps.get(i).getTime();
  147.             if (current.isAfter(begin) && current.isBefore(end))
  148.                     temp.add(timestamps.get(i));
  149.         }
  150.         return temp;
  151.     }
  152. }
  153.  
  154. public class SchedulerTest {
  155.  
  156.     static final LocalDateTime TIME = LocalDateTime.of(2016, 10, 25, 10, 15);
  157.  
  158.     public static void main(String[] args) {
  159.         Scanner jin = new Scanner(System.in);
  160.         int k = jin.nextInt();
  161.         if (k == 0) { //test Timestamp with String
  162.             Timestamp<String> t = new Timestamp<>(TIME, jin.next());
  163.             System.out.println(t);
  164.             System.out.println(t.getTime());
  165.             System.out.println(t.getElement());
  166.         }
  167.         if (k == 1) { //test Timestamp with ints
  168.             Timestamp<Integer> t1 = new Timestamp<>(TIME, jin.nextInt());
  169.             System.out.println(t1);
  170.             System.out.println(t1.getTime());
  171.             System.out.println(t1.getElement());
  172.             Timestamp<Integer> t2 = new Timestamp<>(TIME.plusDays(10), jin.nextInt());
  173.             System.out.println(t2);
  174.             System.out.println(t2.getTime());
  175.             System.out.println(t2.getElement());
  176.             System.out.println(t1.compareTo(t2));
  177.             System.out.println(t2.compareTo(t1));
  178.             System.out.println(t1.equals(t2));
  179.             System.out.println(t2.equals(t1));
  180.         }
  181.         if (k == 2) {//test Timestamp with String, complex
  182.             Timestamp<String> t1 = new Timestamp<>(ofEpochMS(jin.nextLong()), jin.next());
  183.             System.out.println(t1);
  184.             System.out.println(t1.getTime());
  185.             System.out.println(t1.getElement());
  186.             Timestamp<String> t2 = new Timestamp<>(ofEpochMS(jin.nextLong()), jin.next());
  187.             System.out.println(t2);
  188.             System.out.println(t2.getTime());
  189.             System.out.println(t2.getElement());
  190.             System.out.println(t1.compareTo(t2));
  191.             System.out.println(t2.compareTo(t1));
  192.             System.out.println(t1.equals(t2));
  193.             System.out.println(t2.equals(t1));
  194.         }
  195.         if (k == 3) { //test Scheduler with String
  196.             Scheduler<String> scheduler = new Scheduler<>();
  197.             LocalDateTime now = LocalDateTime.now();
  198.             scheduler.add(new Timestamp<>(now.minusHours(2), jin.next()));
  199.             scheduler.add(new Timestamp<>(now.minusHours(1), jin.next()));
  200.             scheduler.add(new Timestamp<>(now.minusHours(4), jin.next()));
  201.             scheduler.add(new Timestamp<>(now.plusHours(2), jin.next()));
  202.             scheduler.add(new Timestamp<>(now.plusHours(4), jin.next()));
  203.             scheduler.add(new Timestamp<>(now.plusHours(1), jin.next()));
  204.             scheduler.add(new Timestamp<>(now.plusHours(5), jin.next()));
  205.             System.out.println(scheduler.next().getElement());
  206.             System.out.println(scheduler.last().getElement());
  207.             List<Timestamp<String>> result = scheduler.getAll(now.minusHours(3), now.plusHours(4).plusMinutes(15));
  208.             String out = result.stream()
  209.                     .sorted()
  210.                     .map(Timestamp::getElement)
  211.                     .collect(Collectors.joining(", "));
  212.             System.out.println(out);
  213.         }
  214.         if (k == 4) {//test Scheduler with ints complex
  215.             Scheduler<Integer> scheduler = new Scheduler<>();
  216.             int counter = 0;
  217.             ArrayList<Timestamp<Integer>> forRemoval = new ArrayList<>();
  218.             while (jin.hasNextLong()) {
  219.                 Timestamp<Integer> ti = new Timestamp<>(ofEpochMS(jin.nextLong()), jin.nextInt());
  220.                 if ((counter & 7) == 0) {
  221.                     forRemoval.add(ti);
  222.                 }
  223.                 scheduler.add(ti);
  224.                 ++counter;
  225.             }
  226.             jin.next();
  227.  
  228.             while (jin.hasNextLong()) {
  229.                 LocalDateTime left = ofEpochMS(jin.nextLong());
  230.                 LocalDateTime right = ofEpochMS(jin.nextLong());
  231.                 List<Timestamp<Integer>> res = scheduler.getAll(left, right);
  232.                 Collections.sort(res);
  233.                 System.out.println(left + " <: " + print(res) + " >: " + right);
  234.             }
  235.             System.out.println("test");
  236.             List<Timestamp<Integer>> res = scheduler.getAll(ofEpochMS(0), ofEpochMS(Long.MAX_VALUE));
  237.             Collections.sort(res);
  238.             System.out.println(print(res));
  239.             forRemoval.forEach(scheduler::remove);
  240.             res = scheduler.getAll(ofEpochMS(0), ofEpochMS(Long.MAX_VALUE));
  241.             Collections.sort(res);
  242.             System.out.println(print(res));
  243.         }
  244.     }
  245.  
  246.     private static LocalDateTime ofEpochMS(long ms) {
  247.         return LocalDateTime.ofInstant(Instant.ofEpochMilli(ms), ZoneId.systemDefault());
  248.     }
  249.  
  250.     private static <T> String print(List<Timestamp<T>> res) {
  251.         if (res == null || res.size() == 0) return "NONE";
  252.         return res.stream()
  253.                 .map(each -> each.getElement().toString())
  254.                 .collect(Collectors.joining(", "));
  255.     }
  256.  
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement