Advertisement
Martina312

[НП] - Генерички евалуатор

Aug 22nd, 2020
3,517
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.76 KB | None | 0 0
  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3. import java.util.stream.Collectors;
  4.  
  5. interface IEvaluator<T extends Comparable<T>> {
  6.     boolean evaluate(T a, T b);
  7. }
  8.  
  9. class EvaluatorBuilder<T extends Comparable<T>>{
  10.     public static <T extends Comparable<T>> IEvaluator<T> build (String operator){
  11.         IEvaluator<T> result = null;
  12.         switch (operator){
  13.             case ">":
  14.                 result = (a,b) -> a.compareTo(b) > 0;
  15.                 return result;
  16.             case "==":
  17.                 result = (a, b) -> a.compareTo(b) == 0;
  18.                 return result;
  19.             case "!=":
  20.                 result = (a, b) -> !a.equals(b);
  21.                 return result;
  22.             case "<":
  23.                 result = (a,b)  -> a.compareTo(b) < 0;
  24.                 return result;
  25.             default:
  26.                 return result;
  27.         }
  28.     }
  29. }
  30.  
  31. class Evaluator{
  32.     static <T extends Comparable<T>> boolean evaluateExpression(T left, T right, String operator){
  33.         IEvaluator<T> evaluator = EvaluatorBuilder.build(operator);
  34.         return evaluator.evaluate(left, right);
  35.     }
  36. }
  37. public class EvaluatorTest {
  38.  
  39.     private static class Student implements Comparable<Student>{
  40.         String id;
  41.         Double average;
  42.         int year;
  43.  
  44.         Student(String id, Double average, int year) {
  45.             this.id = id;
  46.             this.average = average;
  47.             this.year = year;
  48.         }
  49.  
  50.         public static Student createInstance (String input) {
  51.             String [] parts = input.split("\\s+");
  52.             Double average = Double.parseDouble(parts[1]);
  53.             int year = Integer.parseInt(parts[2]);
  54.             return new Student(parts[0], average, year);
  55.         }
  56.  
  57.         @Override
  58.         public int compareTo(Student student) {
  59.             int compResult = Double.compare(this.average, student.average);
  60.             if (compResult==0)
  61.                 return Integer.compare(this.year, student.year);
  62.             else
  63.                 return compResult;
  64.         }
  65.     }
  66.  
  67.     public static void main(String[] args) {
  68.  
  69.         Scanner sc = new Scanner(System.in);
  70.  
  71.         while (sc.hasNext()) {
  72.             String line = sc.nextLine();
  73.             String [] parts = line.split("\\s+");
  74.             String operator = parts[2];
  75.  
  76.             if (parts[0].equals("1")) { //Integers
  77.                 Integer left = Integer.valueOf(parts[1]);
  78.                 Integer right = Integer.valueOf(parts[3]);
  79.                 System.out.println(Evaluator.evaluateExpression(left,right,operator));
  80.  
  81.             }
  82.             else if (parts[0].equals("2")) { //Double
  83.                 Double left = Double.valueOf(parts[1]);
  84.                 Double right = Double.valueOf(parts[3]);
  85.                 System.out.println(Evaluator.evaluateExpression(left,right,operator));
  86.             }
  87.             else if (parts[0].equals("3")) { //Characters
  88.                 Character left = parts[1].charAt(0);
  89.                 Character right = parts[3].charAt(0);
  90.                 System.out.println(Evaluator.evaluateExpression(left,right,operator));
  91.             }
  92.             else if (parts[0].equals("4")) { //String
  93.                 System.out.println(Evaluator.evaluateExpression(parts[1],parts[3],operator));
  94.             }
  95.             else { // Students
  96.                 operator = parts[3];
  97.                 String sInfo1 = Arrays.stream(parts).limit(3).collect(Collectors.joining(" "));
  98.                 String sInfo2 = Arrays.stream(parts).skip(4).limit(3).collect(Collectors.joining(" "));
  99.                 Student s1 = Student.createInstance(sInfo1);
  100.                 Student s2 = Student.createInstance(sInfo2);
  101.                 System.out.println(Evaluator.evaluateExpression(s1,s2,operator));
  102.             }
  103.         }
  104.  
  105.     }
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement