summaryrefslogtreecommitdiff
path: root/graphs/java/grades/src/main
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /graphs/java/grades/src/main
add: graphs et rushs
Diffstat (limited to 'graphs/java/grades/src/main')
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java13
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java98
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java4
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java4
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java8
-rw-r--r--graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java8
6 files changed, 135 insertions, 0 deletions
diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java
new file mode 100644
index 0000000..fa9d24e
--- /dev/null
+++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/EntryNotFoundException.java
@@ -0,0 +1,13 @@
+package fr.epita.assistants.grades;
+
+public class EntryNotFoundException extends RuntimeException {
+ /**
+ * @param entryClass The class of the collection's entries
+ * @param query The string representation of the search query
+ */
+ public EntryNotFoundException(Class<?> entryClass, String query) {
+ super(String.format("%s not found for: `%s`",
+ entryClass.getSimpleName(),
+ query));
+ }
+}
diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java
new file mode 100644
index 0000000..91da40b
--- /dev/null
+++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/GradeHandler.java
@@ -0,0 +1,98 @@
+package fr.epita.assistants.grades;
+
+import fr.epita.assistants.grades.model.*;
+
+import java.util.*;
+import java.util.function.*;
+import java.util.stream.*;
+
+public class GradeHandler {
+ private final List<Activity> activities;
+ private final List<Student> students;
+
+ public GradeHandler() {
+ this.activities = new ArrayList<>();
+ this.students = new ArrayList<>();
+ }
+
+ /**
+ * @param activity The {@link Activity} to be added
+ * @return {@code true} (as specified by {@link List#add})
+ */
+ public boolean addActivity(Activity activity) {
+ this.activities.add(activity);
+ return true;
+ }
+
+ /**
+ * @param student The {@link Student} to be added
+ * @return {@code true} (as specified by {@link List#add})
+ */
+ public boolean addStudent(Student student) {
+ students.add(student);
+ return true;
+ }
+
+ /**
+ * @param name The name of the desired {@link Student}
+ * @return The desired student
+ * @throws EntryNotFoundException No known {@link Student} with the given name
+ */
+ public Student getStudent(String name) throws EntryNotFoundException {
+ Optional<Student> o = students.stream().filter(i -> i.name().equals(name)).findFirst();
+ if (o.isEmpty())
+ throw new EntryNotFoundException(Student.class, name);
+ else
+ return o.get();
+ }
+
+ /**
+ * @param grade The {@link Grade} to be added to the {@link Student}
+ * @param name The name of the desired {@link Student}
+ * @return {@code true} (as specified by {@link List#add})
+ * @throws EntryNotFoundException No known {@link Student} with the given name
+ */
+ public boolean addGradeToStudent(Grade grade, String name) throws EntryNotFoundException {
+ getStudent(name).grades().add(grade);
+ return true;
+ }
+
+ /**
+ * @param name The name of the desired {@link Student} to remove
+ * @return The removed {@link Student}
+ * @throws EntryNotFoundException No known {@link Student} with the given name
+ */
+ public Student removeStudent(String name) throws EntryNotFoundException {
+ Student s = getStudent(name);
+ students.remove(getStudent(name));
+ return s;
+ }
+
+ /**
+ * @param name The name of the desired {@link Student}
+ * @param function A {@link Function} returning an updated {@link Student} from the given one
+ * @throws EntryNotFoundException No known {@link Student} with the given name
+ */
+ public void updateStudent(String name, Function<Student, Student> function) throws EntryNotFoundException {
+ addStudent(function.apply(removeStudent(name)));
+ }
+
+ /**
+ * @param name The name of the {@link Student} from which to get grades
+ * @param subject The {@link Subject} from which we want the student's average
+ * @return The student's average grade in the specified subject (0 if no grades are available)
+ * @throws EntryNotFoundException No known {@link Student} with the given name
+ */
+ public double getStudentAverageInSubject(String name, Subject subject) throws EntryNotFoundException {
+ Optional<Student> o = students.stream().filter(i -> i.name().equals(name)).findFirst();
+ if (o.isPresent()) {
+ Student s = o.get();
+ OptionalDouble d = s.grades().stream().filter(g -> g.activity().subject() == subject).mapToDouble(Grade::grade).average();
+ if (d.isEmpty())
+ return 0.0;
+ else return d.getAsDouble();
+ }
+ else
+ throw new EntryNotFoundException(getClass(), name);
+ }
+}
diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java
new file mode 100644
index 0000000..fe3e285
--- /dev/null
+++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Activity.java
@@ -0,0 +1,4 @@
+package fr.epita.assistants.grades.model;
+
+public record Activity(String name, Subject subject, float weight) {
+}
diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java
new file mode 100644
index 0000000..fb63a6c
--- /dev/null
+++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Grade.java
@@ -0,0 +1,4 @@
+package fr.epita.assistants.grades.model;
+
+public record Grade(Activity activity, int grade) {
+}
diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java
new file mode 100644
index 0000000..335e073
--- /dev/null
+++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Student.java
@@ -0,0 +1,8 @@
+package fr.epita.assistants.grades.model;
+
+import lombok.Builder;
+
+import java.util.List;
+
+@Builder
+public record Student(String name, int age, List<Grade> grades) {}
diff --git a/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java
new file mode 100644
index 0000000..00bc685
--- /dev/null
+++ b/graphs/java/grades/src/main/java/fr/epita/assistants/grades/model/Subject.java
@@ -0,0 +1,8 @@
+package fr.epita.assistants.grades.model;
+
+public enum Subject {
+ STEMS,
+ SHAPE,
+ HEAL,
+ Maths;
+}