public void findMatchingCoursesWithSections( ArrayList<SchedulerCourse> currSectionCourses, ArrayList<SchedulerCourse> coursesToCheck) { // Base case - when you run out of classes to check against if (coursesToCheck.size() == 0) { if (this.containsAllClasses(currSectionCourses)) { this.schedules.add(currSectionCourses); this.filteredSchedules.add(currSectionCourses); } } else { // go through JUST next course to check against ArrayList<SchedulerCourse> tempCoursesToCheck = this.cloneSchedulerCoursList(coursesToCheck); SchedulerCourse course = tempCoursesToCheck.get(0); ArrayList<ClassSection> sections = course.getSections(); tempCoursesToCheck.remove(0); boolean notAlreadyFound = true; // compile all sections of all current // built up classes for later comparison // compare ALL sections to current built up list ArrayList<ClassSection> currClassSections = new ArrayList<ClassSection>(); for (SchedulerCourse currCourse : currSectionCourses) { for (ClassSection classSect : currCourse.getSections()) { currClassSections.add(classSect); } } // check for optional classes if (course.isOptional()) { notAlreadyFound = false; this.findMatchingCoursesWithSections(currSectionCourses, tempCoursesToCheck); } // go through each course section of JUST this course for (ClassSection section : sections) { if (!isSectionEmpty(section)) { if (!this.sectionsOverlapWithnewSection(currClassSections, section)) { ArrayList<ClassSection> newClassSections = new ArrayList<ClassSection>(); newClassSections.add(section); SchedulerCourse newCourse = new SchedulerCourse(course.getCourseName(), newClassSections, course.isOptional()); ArrayList<SchedulerCourse> newCourses = this.cloneSchedulerCoursList(currSectionCourses); newCourses.add(newCourse); this.findMatchingCoursesWithSections(newCourses, tempCoursesToCheck); } } } } }
public ArrayList<ArrayList<SchedulerCourse>> permutateSchedules() { // reset instance variables this.schedules.clear(); this.filteredSchedules.clear(); this.nonOptionalClasses.clear(); if (this.classes == null || this.classes.size() == 0) { return this.schedules; } // find NON-optional classes for (SchedulerCourse course : this.classes) { if (!course.isOptional()) { this.nonOptionalClasses.add(course); } } // fixate one course to create branches from SchedulerCourse course = this.classes.get(0); ArrayList<ClassSection> sections = course.getSections(); // go through each section for (ClassSection section : sections) { if (!isSectionEmpty(section)) { ArrayList<ClassSection> sectionList = new ArrayList<ClassSection>(); sectionList.add(section); SchedulerCourse cour = new SchedulerCourse(course.getCourseName(), sectionList, course.isOptional()); ArrayList<SchedulerCourse> courses = new ArrayList<SchedulerCourse>(); courses.add(cour); // deep clone classes list ArrayList<SchedulerCourse> coursesToCheck = this.cloneSchedulerCoursList(this.classes); // remove courses not to check int index = this.classes.indexOf(course); for (int i = 0; i <= index; i++) { coursesToCheck.remove(i); } this.findMatchingCoursesWithSections(courses, coursesToCheck); } } return this.schedules; }