package design.model.course_search; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import design.model.*; /* * Defines a list of courses that can be sorted, added to or removed from. * Willem Dalton */ public class CourseList implements ICourse { private CourseSorter sorter; private List courses; public CourseList() { courses = new ArrayList<>(); } /* * Grab the list of courses */ public List getCourses() { return courses; } /* * Set the list of courses equal to an existing list */ public void setCourses(List courses) { this.courses = courses; } /* * set the chosen sorting algorithm for the given list. */ public void setSorter(CourseSorter courseSorter) { sorter = courseSorter; } /* * Add a new course to the list. */ public void add(ICourse course) { courses.add(course); } /* * Remove a course from the list. */ public void remove(ICourse course) { courses.remove(course); } /* * Sort the list. */ public void sort() { sorter.sortCourses(courses); } public CourseList groupByCurrentSorter() { CourseList groupedList = new CourseList(); if (courses.isEmpty() || sorter == null) { return this; } // Sort by current sorter sort(); // Group consecutive equal elements List currentGroup = new ArrayList<>(); ICourse prev = null; for (ICourse c : courses) { if (prev == null || !sorter.isEqual(prev, c)) { if (!currentGroup.isEmpty()) { CourseList sublist = new CourseList(); sublist.setCourses(new ArrayList<>(currentGroup)); groupedList.add(sublist); currentGroup.clear(); } } currentGroup.add(c); prev = c; } if (!currentGroup.isEmpty()) { CourseList sublist = new CourseList(); sublist.setCourses(currentGroup); groupedList.add(sublist); } return groupedList; } /* * All overrides of the ICourse class. This is a drawback of the composite pattern, but it's pretty negligible here. return some dummy values. */ @Override public String getName() { return "Course List"; } @Override public float getDifficultyRating() { return 0; } @Override public String getLocation() { return ""; } @Override public int getTotalPar() { return 0; } @Override public int getHoleCount() { return 0; } @Override public List getHoles() { return null; } @Override public String toString() { // to do: implement returning courslist children return "wip"; } }