使用集合不仅可以表示一对一的关系,也可以表示多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。
要完成上面要求,首先应该定义两个类,分别是学生信息(Student)类、课程信息(Course)类。在学生类中存在一个集合,保存全部的课程。同样,在课程类中也要存在一个集合,保存全部的学生。
1)定义学生类
public class Student { private String name; private int age; private List<Course> allCourses; // 定义集合保存全部课程 private Student() { this.allCourses = new ArrayList<Course>();// 实例化List集合 } // 通过构造方法设置内容 public Student(String name, int age) { // 调用无参构造 this(); this.setName(name); this.setAge(age); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<Course> getAllCourses() { return allCourses; } public void setAllCourses(List<Course> allCourses) { this.allCourses = allCourses; } // 重写toString()方法 public String toString() { return "学生姓名:" + this.name + ":年龄" + this.age; } }
在学生类中存在一个 allCourses 的 List 集合,这样在程序运行时,一个学生类中可以保存多个 Course 对象。
2)定义课程类
public class Course { private String name; private int credit; // 定义集合保存多个学生 private List<Student> allStudents; private Course() { // 实例化List集合 this.allStudents = new ArrayList<Student>(); } public Course(String name, int credit) { this(); this.setName(name); this.setCredit(credit); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCredit() { return credit; } public void setCredit(int credit) { this.credit = credit; } public List<Student> getAllStudents() { return allStudents; } public void setAllStudents(List<Student> allStudents) { this.allStudents = allStudents; } // 重写toString()方法 public String toString() { return "课程名称" + this.name + ";课程学分" + this.credit; } }
课程类与学生类一样,都定义了一个 List 集合,用于保存多个学生信息。
3)测试程序
public class TestMore { public static void main(String[] args) { // 实例化课程对象 Course c1 = new Course("英语", 3); Course c2 = new Course("计算机", 5); // 实例化学生对象 Student s1 = new Student("张三", 20); Student s2 = new Student("李四", 21); Student s3 = new Student("王五", 22); Student s4 = new Student("赵六", 23); Student s5 = new Student("孙七", 24); Student s6 = new Student("钱八", 25); // 第一门课程有3个人参加,向课程中增加3个学生信息,同时向学生中增加课程信息 c1.getAllStudents().add(s1); c1.getAllStudents().add(s2); c1.getAllStudents().add(s6); s1.getAllCourses().add(c1); s2.getAllCourses().add(c1); s6.getAllCourses().add(c1); // 第二门课程有6个人参加,向课程中增加6个学生信息,同时向学生中添加课程信息 // 向课程中增加学生信息 c2.getAllStudents().add(s1); c2.getAllStudents().add(s2); c2.getAllStudents().add(s3); c2.getAllStudents().add(s4); c2.getAllStudents().add(s5); c2.getAllStudents().add(s6); // 像学生中增加课程信息 s1.getAllCourses().add(c2); s2.getAllCourses().add(c2); s3.getAllCourses().add(c2); s4.getAllCourses().add(c2); s5.getAllCourses().add(c2); s6.getAllCourses().add(c2); // 输出一门课程的信息,观察一门课程有多少个学生参加 System.out.println(c1); // 输出第一门课程 Iterator<Student> iter1 = c1.getAllStudents().iterator(); // 迭代输出 while (iter1.hasNext()) { Student s = iter1.next(); System.out.println("\t" + s); } // 输出一个学生参加的课程信息,观察有多少门课程 System.out.println(s6); Iterator<Course> iter2 = s6.getAllCourses().iterator(); while (iter2.hasNext()) { // 取得所参加的课程 Course c = iter2.next(); // 输出课程信息 System.out.println("\t" + c); } } }
输出结果如下:
课程名称英语;课程学分3 学生姓名:张三:年龄20 学生姓名:李四:年龄21 学生姓名:钱八:年龄25 学生姓名:钱八:年龄25 课程名称英语;课程学分3 课程名称计算机;课程学分5
从程序来看,设计关系的地方较为复杂,因为现在的程序采用的是双向的处理关系,所以学生在选择一个课程时,除了课程中要添加学生,在学生中也要添加课程信息。在输出课程信息时,可以通过课程对象中的集合找到参加此课程的全部学生信息,也可以通过学生找到全部参加的课程信息。