Filip_Markoski

[NP] Распоредувач на задачи

Nov 14th, 2017
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.53 KB | None | 0 0
  1. import java.lang.reflect.Array;
  2. import java.util.*;
  3. import java.util.stream.Collectors;
  4. import java.util.stream.IntStream;
  5.  
  6. /**
  7.  * I Partial exam 2016
  8.  */
  9.  
  10. interface Task {
  11.     int getOrder();
  12. }
  13.  
  14. interface TaskScheduler<T extends Task> {
  15.     List<T> schedule(T tasks[]);
  16. }
  17.  
  18.  
  19. class TimedTask implements Task {
  20.     private final int time;
  21.  
  22.     public TimedTask(int time) {
  23.         this.time = time;
  24.     }
  25.  
  26.     @Override
  27.     public String toString() {
  28.         return String.format("TT -> %d", getOrder());
  29.     }
  30.  
  31.     @Override
  32.     public int getOrder() {
  33.         return time;
  34.     }
  35. }
  36.  
  37. class PriorityTask implements Task {
  38.     private final int priority;
  39.  
  40.     public PriorityTask(int priority) {
  41.         this.priority = priority;
  42.     }
  43.  
  44.  
  45.     @Override
  46.     public String toString() {
  47.         return String.format("PT -> %d", getOrder());
  48.     }
  49.  
  50.     @Override
  51.     public int getOrder() {
  52.         return priority;
  53.     }
  54. }
  55.  
  56. class Schedulers<T extends Task> implements TaskScheduler<T> {
  57.  
  58.     /*
  59.     TaskScheduler<T> result = new TaskScheduler<T>() {
  60.         @Override
  61.         public List<T> schedule(T tasks[]) {
  62.             ArrayList<T> listTasks = new ArrayList<T>(Arrays.asList(tasks));
  63.             Comparator<? super T> comparator = new Comparator<T>() {
  64.                 @Override
  65.                 public int compare(T left, T right) {
  66.                     if (left.getOrder() < right.getOrder()) return -1;
  67.                     else if (left.getOrder() > right.getOrder()) return 1;
  68.                     return 0;
  69.                 }
  70.             };
  71.             listTasks.sort(comparator);
  72.             return listTasks;
  73.         }
  74.     };
  75.      */
  76.  
  77.     private Comparator<T> comparator = Comparator.comparing(Task::getOrder);
  78.  
  79.     public static <T extends Task> TaskScheduler<T> getOrdered() {
  80.         return new TaskScheduler<T>() {
  81.             @Override
  82.             public List<T> schedule(T[] tasks) {
  83.                 return Arrays.stream(tasks)
  84.                         .sorted(Comparator.comparing(Task::getOrder))
  85.                         .collect(Collectors.toList());
  86.             }
  87.         };
  88.  
  89.     }
  90.  
  91.     /*
  92.     TaskScheduler<T> result = new TaskScheduler<T>() {
  93.             @Override
  94.             public ArrayList<T> schedule(T[] tasks) {
  95.                 ArrayList<T> listTasks = new ArrayList<T>();
  96.                 for (int i = 0; i < tasks.length; i++) {
  97.                     if (tasks[i].getOrder() < order) {
  98.                         listTasks.add(tasks[i]);
  99.                     }
  100.                 }
  101.                 return listTasks;
  102.             }
  103.         };
  104.         return result;
  105.  
  106.      */
  107.  
  108.     public static <T extends Task> TaskScheduler<T> getFiltered(int order) {
  109.         return tasks -> IntStream.range(0, tasks.length) // generates Integers from 0 to tasks.length
  110.                 .filter(i -> tasks[i].getOrder() < order) // returns each Integer for which the expression is satisfied
  111.                 .mapToObj(i -> tasks[i]) // returns Task[Integer]
  112.                 .collect(Collectors.toList()); // collects all those Task[Integers] into one List
  113.  
  114.  
  115.         /* Before changing the TaskScheduler<T> interface to use List<T> instead of ArrayList<T> */
  116.  
  117.         /* Doesn't Work */
  118.         /*return (ArrayList<T>) tasks -> Arrays.stream(tasks)
  119.                 .filter(task -> task.getOrder() < order)
  120.                 .collect(Collectors.toList());*/
  121.  
  122.         /* Works! using toCollection(ArrayList::new) */
  123.  
  124.         /*return tasks -> Arrays.stream(tasks)
  125.                 .filter(task -> task.getOrder() < order)
  126.                 .collect(Collectors.toCollection(ArrayList::new));*/
  127.  
  128.         /*return tasks -> IntStream.range(0, tasks.length)
  129.                 .filter(i -> tasks[i].getOrder() < order)
  130.                 .mapToObj(i -> tasks[i])
  131.                 .collect(Collectors.toCollection(ArrayList::new));*/
  132.     }
  133.  
  134.     @Override
  135.     public List<T> schedule(T[] tasks) {
  136.         List<T> listTasks = new ArrayList<T>(Arrays.asList(tasks));
  137.         return listTasks;
  138.     }
  139. }
  140.  
  141. class TaskRunner<T extends Task> {
  142.     public void run(TaskScheduler<T> scheduler, T[] tasks) {
  143.         List<T> order = scheduler.schedule(tasks);
  144.         order.forEach(System.out::println);
  145.     }
  146. }
  147.  
  148. public class TaskSchedulerTest {
  149.     public static void main(String[] args) {
  150.         Scanner scanner = new Scanner(System.in);
  151.         int n = scanner.nextInt();
  152.         Task[] timeTasks = new Task[n];
  153.         for (int i = 0; i < n; ++i) {
  154.             int x = scanner.nextInt();
  155.             timeTasks[i] = new TimedTask(x);
  156.         }
  157.         n = scanner.nextInt();
  158.         Task[] priorityTasks = new Task[n];
  159.         for (int i = 0; i < n; ++i) {
  160.             int x = scanner.nextInt();
  161.             priorityTasks[i] = new PriorityTask(x);
  162.         }
  163.         Arrays.stream(priorityTasks).forEach(System.out::println);
  164.         TaskRunner<Task> runner = new TaskRunner<>();
  165.         System.out.println("=== Ordered tasks ===");
  166.         System.out.println("Timed tasks");
  167.         runner.run(Schedulers.getOrdered(), timeTasks);
  168.         System.out.println("Priority tasks");
  169.         runner.run(Schedulers.getOrdered(), priorityTasks);
  170.         int filter = scanner.nextInt();
  171.         System.out.printf("=== Filtered time tasks with order less then %d ===\n", filter);
  172.         runner.run(Schedulers.getFiltered(filter), timeTasks);
  173.         System.out.printf("=== Filtered priority tasks with order less then %d ===\n", filter);
  174.         runner.run(Schedulers.getFiltered(filter), priorityTasks);
  175.         scanner.close();
  176.     }
  177. }
Add Comment
Please, Sign In to add comment