|
|
import java.util.List;
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
|
|
/*
|
|
* SD2x Homework #10
|
|
* Modify the method below so that it uses defensive programming.
|
|
* Please be sure not to change the method signature!
|
|
*/
|
|
|
|
public class FriendFinder {
|
|
|
|
protected ClassesDataSource classesDataSource;
|
|
protected StudentsDataSource studentsDataSource;
|
|
|
|
public FriendFinder(ClassesDataSource cds, StudentsDataSource sds) {
|
|
classesDataSource = cds;
|
|
studentsDataSource = sds;
|
|
}
|
|
|
|
|
|
public Set<String> findClassmates(Student theStudent) {
|
|
if(theStudent == null) throw new IllegalArgumentException();
|
|
if(theStudent.getName() == null) throw new IllegalArgumentException();
|
|
|
|
if(this.classesDataSource == null) throw new IllegalStateException();
|
|
if(this.studentsDataSource== null) throw new IllegalStateException();
|
|
String name = theStudent.getName();
|
|
if (name == null) throw new IllegalStateException();
|
|
|
|
// find the classes that this student is taking
|
|
List<String> myClasses = classesDataSource.getClasses(name);
|
|
|
|
if (myClasses == null) return null;
|
|
|
|
Set<String> classmates = new HashSet<String>();
|
|
|
|
// use the classes to find the names of the students
|
|
for (String myClass : myClasses) {
|
|
// list all the students in the class
|
|
if(myClass == null) continue;
|
|
List<Student> students = studentsDataSource.getStudents(myClass);
|
|
if (students == null) continue;
|
|
for (Student student : students) {
|
|
if (student == null) continue;
|
|
if(student.getName() == null) continue;
|
|
// find the other classes that they're taking
|
|
List<String> theirClasses = classesDataSource.getClasses(student.getName());
|
|
if (theirClasses == null) continue;
|
|
// see if all of the classes that they're taking are the same as the ones this student is taking
|
|
boolean same = true;
|
|
for (String c : myClasses) {
|
|
if (c == null) continue;
|
|
if (theirClasses.contains(c) == false) {
|
|
same = false;
|
|
break;
|
|
}
|
|
}
|
|
if (same) {
|
|
if (student.getName().equals(name) == false && classmates.contains(student.getName()) == false)
|
|
classmates.add(student.getName());
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if (classmates.isEmpty()) {
|
|
return null;
|
|
}
|
|
else return classmates;
|
|
}
|
|
|
|
|
|
}
|