import enumeration.BachelorSemester; import enumeration.Gender; import enumeration.Mark; import enumeration.Status; import java.util.*; public class Student extends UniversityMember implements Calcuable { // no static because variables don't make any sense without the created object private Status status; private boolean paidFees; private BachelorSemester bachelorSemester; private Map<Course, Mark> grades = new HashMap<>(); public Student(int id, Gender gender, String firstName, String lastName, String placeOfResidence, String birthPlace, String officialEmail, String privateEmail, List<Course> personalCourses, Status status, BachelorSemester bachelorSemester) { super(id, gender, firstName, lastName, placeOfResidence, birthPlace, officialEmail, privateEmail, personalCourses); this.status = status; this.paidFees = true; this.bachelorSemester = bachelorSemester; this.initGrades(); } private void initGrades() { for (Course course : this.getPersonalCourses()) { grades.put(course, null); } } public boolean setGrade(Course course, Mark mark) { if (isSignedUpForCourse(course)) { grades.replace(course, mark); return true; } return false; } public Map<Course, Mark> getGrades() { return grades; } public boolean increaseSemester() { if (paidFees) { bachelorSemester.increaseSemester(); return true; } else { return false; } } @Override public double calculateAverage() { double average = 0.0; int counter = 0; for (Map.Entry<Course, Mark> grade : grades.entrySet()) { if (grade.getValue() != null) { Mark temp = grade.getValue(); average += temp.getValue(); counter++; } } return average / counter; } @Override public int calculateMedian() { List<Mark> markList = new ArrayList<>(); int median = 0; for (Map.Entry<Course, Mark> grade : grades.entrySet()) { if (grade.getValue() != null) { markList.add(grade.getValue()); } } markList.sort(Comparator.comparing(Mark::getValue)); median = (int) markList.get(markList.size() / 2).getValue(); if (markList.size() % 2 == 0) median = (int) ((median + markList.get(markList.size() / 2 - 1).getValue()) / 2); return median; } @Override public double calculateModus() { return 0.0; } }