摘自《java开发实战经典》李兴华.著

一对多的关系

一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示。

在定义Student类中包含了一个School属性,表示一个学生属于一个学校。在程序运行时,只需要传入School类的引用就可以完成这样的关系。

在定义School类时定义了一个List类型的属性,并指定其泛型类型是Student类型,这样一来就表示在一个School对象中会包含多个Student类型的引用。

最后在主函数设置学校和学生的对应关系。也可以用Map来实现学校映射学生的list集合之间的关系。

 import java.util.*;
public class TestDemo{//设置学校和学生的关系
public static void main(String args[]){
School sch = new School("清华大学") ;//实例化学校对象
Student s1 = new Student("张三",21) ;//实例化学生对象
Student s2 = new Student("李四",22) ;
Student s3 = new Student("王五",23) ;
sch.getAllStudents().add(s1) ;//在学校中加入学生
sch.getAllStudents().add(s2) ;
sch.getAllStudents().add(s3) ;
s1.setSchool(sch) ;//一个学生属于一个学校
s2.setSchool(sch) ;
s3.setSchool(sch) ;
System.out.println(sch) ;
Iterator<Student> iter = sch.getAllStudents().iterator() ;
while(iter.hasNext()){
System.out.println("\t|- " + iter.next()) ;
}
}
} //学生类
class Student{
private String name ;
private int age ;
private School school; // 一个学生属于一个学校
public Student(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public void setSchool(School school){
this.school = school ;
}
public School getSchool(){
return this.school ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age ;
}
public String toString(){
return "学生姓名:" + this.name + ";年龄:" + this.age ;
}
} //学校类
class School{
private String name ;
private List<Student> allStudents ;//一个学校有多个学生
public School(String name){
this.allStudents = new ArrayList<Student>();
this.setName(name) ;
}
public void setName(String name){
this.name = name ;
}
public String getName(){
return this.name;
}
public List<Student> getAllStudents(){//取得全部的学生
return this.allStudents ;
}
public String toString(){
return "学校名称:" + this.name ;
}
}

多对多关系

使用类集不仅可以表示出一对一的关系,也可以表示出多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。

要完成本程序,首先应该定义两个类:学生信息类Student、课程信息类Course。在一个学生类中存在一个集合,保存全部的课程;而在课程类中也要存在一个集合,保存全部的学生。

 import java.util.*;
// 定义学生类
class Student {
private String name ;
private int age ;
private List<Course> allCourses ; // 定义集合保存全部课程
public Student(){// 无参构造
this.allCourses = new ArrayList<Course>() ;// 实例化List集合
}
public Student(String name,int age){ // 通过构造设置属性内容
this() ; // 调用无参构造
this.setName(name) ; // 设置name属性内容
this.setAge(age) ; // 设置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 String toString(){ // 覆写toString()方法
return "学生姓名:" + this.name + ";年龄:" + this.age ;
}
} //在学生类中存在一个allCourses的List集合,这样在程序运行时,一个学生类中可以保存多个Course对象。 //定义课程类
class Course {
private String name ; //
private int credit ; // 定义学分
private List<Student> allStudents ; // 定义集合保存多个学生
public Course(){ // 无参构造方法
this.allStudents = new ArrayList<Student>() ;// 实例化List集合
}
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;
}
public String toString(){
return "课程名称:" + this.name + ";课程学分" + this.credit ;
}
} //课程类与学生类一样,都定义了一个List集合,用于保存多个学生信息。 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); // 输出课程信息
}
}
}
---------- java ----------
课程名称:英语;课程学分3
|- 学生姓名:张三;年龄:20
|- 学生姓名:李四;年龄:21
|- 学生姓名:钱八;年龄:25
学生姓名:钱八;年龄:25
|- 课程名称:英语;课程学分3
|- 课程名称:计算机;课程学分5 输出完成 (耗时 0 秒) - 正常终止

java类集开发中一对多和多对多的关系的实现的更多相关文章

  1. Java:类集框架中集合的学习

    Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...

  2. 专题笔记--Java 类集框架

    Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...

  3. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  4. java:类集操作总结

    java:类集操作总结 1.List接口允许有重复的元素,Set接口中不允许有重复的元素 2.ArrayList,和Vector的区别 3.set依靠equals和hashCode区分 4.TreeS ...

  5. 浅谈java类集框架和数据结构(1)

    在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...

  6. Java Web应用开发中的一些概念

    最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...

  7. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  8. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  9. java:类集操作,多对多的关系

    java:类集操作,多对多的关系 //一个课程有多个学生报名, //一个学生可以报名多个课程 demo.java, Student.java, Course.java' public class Co ...

随机推荐

  1. sdk添加新的C文件编译出错

    make: *** 没有规则可以创建"test.elf"需要的目标"mike.c.o". 停止. 解决方法: 重新建立工程并且编译文件

  2. TTL、RS232、RS485、串口

    Point: 1.串口.COM口是指的物理接口形式(硬件).而TTL.RS-232.RS-485是指的电平标准(电信号). 2.接设备的时候,一般只接GND RX TX.不会接Vcc或者+3.3v的电 ...

  3. java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

    在ViewPager中,用Fragment显示页面时,报错: java.lang.IllegalStateException: The specified child already has a pa ...

  4. Winform 中DataGridView的checkbox列,当修改checkbox状态时实时获得其状态值

    不知道大家有没有这样的经验,当点击或者取消datagridview的checkbox列时,比较难获得其状态是选中还是未选中,进而不好进行其它操作,下面就列出它的解决办法: 主要用到了DataGridV ...

  5. python 传参open

    # Author:mologa k = "ab" for i in k: with open('%s.txt'%i,'w') as f: f.write("hello&q ...

  6. XHTML标签的嵌套规则分析

    在 XHTML 的语言里,我们都知道:ul 标签包含着 li.dl 标签包含着 dt 和 dd——这些固定标签的嵌套规则十分明确.但是,还有许多标签是独立的,它们没有被捆绑在一起,比如 h1.div. ...

  7. 【如何快速的开发一个完整的iOS直播app】(美颜篇)

    原文转自:袁峥Seemygo    感谢分享.自我学习 前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,美颜功能是很重 ...

  8. 准备熟悉Kaggle -菜鸟进阶

    原文链接http://www.bubuko.com/infodetail-525389.html 1.Kaggle简介 Kaggle是一个数据分析的竞赛平台,网址:https://www.kaggle ...

  9. survey on Time Series Analysis Lib

    (1)I spent my 4th year Computing project on implementing time series forecasting for Java heap usage ...

  10. 实战录 | Kafka-0.10 Consumer源码解析

    <实战录>导语 前方高能!请注意本期攻城狮幽默细胞爆表,坐地铁的拉好把手,喝水的就建议暂时先别喝了:)本期分享人为云端卫士大数据工程师韩宝君,将带来Kafka-0.10 Consumer源 ...