-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGenericEvaluator.java
105 lines (90 loc) · 3.5 KB
/
GenericEvaluator.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.Collectors;
interface IEvaluator<T extends Comparable>{
boolean evaluate (T a, T b);
}
class EvaluatorBuilder{
static IEvaluator build (String operator){
IEvaluator iEvaluator=null;
if(operator.equals(">")){
iEvaluator = (a,b) -> a.compareTo(b)>0;
}
else if(operator.equals("==")){
iEvaluator = (a,b) -> a.compareTo(b)==0;
}
else if(operator.equals("!=")){
iEvaluator = (a,b) -> a.compareTo(b)!=0;
}else if(operator.equals("<"))
{
iEvaluator = (a,b) -> a.compareTo(b)<0;
}
return iEvaluator;
}
}
class Evaluator{
static <T extends Comparable> boolean evaluateExpression (T left, T right, String operator){
IEvaluator builder = EvaluatorBuilder.build(operator);
return builder.evaluate(left,right);
}
}
public class EvaluatorTest {
private static class Student implements Comparable<Student>{
String id;
Double average;
int year;
Student(String id, Double average, int year) {
this.id = id;
this.average = average;
this.year = year;
}
public static Student createInstance (String input) {
String [] parts = input.split("\\s+");
Double average = Double.parseDouble(parts[1]);
int year = Integer.parseInt(parts[2]);
return new Student(parts[0], average, year);
}
@Override
public int compareTo(Student student) {
int compResult = Double.compare(this.average, student.average);
if (compResult==0)
return Integer.compare(this.year, student.year);
else
return compResult;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String line = sc.nextLine();
String [] parts = line.split("\\s+");
String operator = parts[2];
if (parts[0].equals("1")) { //Integers
Integer left = Integer.valueOf(parts[1]);
Integer right = Integer.valueOf(parts[3]);
System.out.println(Evaluator.evaluateExpression(left,right,operator));
}
else if (parts[0].equals("2")) { //Double
Double left = Double.valueOf(parts[1]);
Double right = Double.valueOf(parts[3]);
System.out.println(Evaluator.evaluateExpression(left,right,operator));
}
else if (parts[0].equals("3")) { //Characters
Character left = parts[1].charAt(0);
Character right = parts[3].charAt(0);
System.out.println(Evaluator.evaluateExpression(left,right,operator));
}
else if (parts[0].equals("4")) { //String
System.out.println(Evaluator.evaluateExpression(parts[1],parts[3],operator));
}
else { // Students
operator = parts[3];
String sInfo1 = Arrays.stream(parts).limit(3).collect(Collectors.joining(" "));
String sInfo2 = Arrays.stream(parts).skip(4).limit(3).collect(Collectors.joining(" "));
Student s1 = Student.createInstance(sInfo1);
Student s2 = Student.createInstance(sInfo2);
System.out.println(Evaluator.evaluateExpression(s1,s2,operator));
}
}
}
}