Advertisement
SashkoKlincharov

[Java][НП] - Генерички распоредувач

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