java类集开发中一对多和多对多的关系的实现
摘自《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类集开发中一对多和多对多的关系的实现的更多相关文章
- Java:类集框架中集合的学习
Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...
- 专题笔记--Java 类集框架
Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- java:类集操作总结
java:类集操作总结 1.List接口允许有重复的元素,Set接口中不允许有重复的元素 2.ArrayList,和Vector的区别 3.set依靠equals和hashCode区分 4.TreeS ...
- 浅谈java类集框架和数据结构(1)
在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...
- Java Web应用开发中的一些概念
最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...
- Java类集框架详细汇总-底层分析
前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
- java:类集操作,多对多的关系
java:类集操作,多对多的关系 //一个课程有多个学生报名, //一个学生可以报名多个课程 demo.java, Student.java, Course.java' public class Co ...
随机推荐
- 【&】位与运算符【|】位或运算符之权限控制算法
[&]位与运算符: 按位与运算符"&"是双目运算符. 其功能是参与运算的两数各对应的二进位相与.只有对应的两个二进位均为1时,结果位才为1 ,否则为0.参与运算的数 ...
- MyEclipse配置Tomcat开发JavaWeb程序JSP以及Servlet
1.安装准备 1).下载安装MyEclipse2014,这已经是最新版本. 2).下载Tomcat 官网:http://tomcat.apache.org/ 我们选择8.0: http://tomca ...
- Android调试小技巧(LogCat不输出、Log自动清空、install时timeout)
问题:有时候明明连接了设备,而LogCat却没有输出 解决方法:在device界面点一下对应设备,使其处于选中状态(它适用于查看手机文件不显示的情况) 问题:前面记录的Log看着看着突然被清空了 解决 ...
- java写入和写出EXCEL(含源代码)
这两天帮老师做一个数据库,将所有实验交易的数据导入到数据库中,但是不想天天在实验室里面待着,气氛太压抑,就想着先把数据读进EXCEL中,哪天带到实验室导进去 数据原来是这样的,不同的实验有一个专门的文 ...
- C/C++入门基础---指针(2)
5,数组指针的不同含义 int a[5][10]; printf(%d, %d, %d\n", a, a+1, &a+1); //1310392,1310432,1310592 a ...
- 3个div 宽度移入移出时变化
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- sendto频率过快导致发送丢包
编写一个转发模块,虽然没有要求一转多时要达到多少路(不采用组播的情况下,单纯的一路转成多路),但是本着物尽其用的原则,尽可能测试一下极限. 网络环境:1000M,直连,多网卡 系统:Linux ver ...
- with try catch 作用域的问题
with({}){}和try{}catch(e){}会临时改变代码执行的作用域, var foo="abc"; with({foo:"d"}){ functio ...
- redis 数据类型
上一篇文章主要写了redis在linux下的安装,这里讲一下redis基本的数据类型,linux的数据类型比较丰富,主要有五种数据类型 .String 字符串类型 常用命令: 除了get.set.in ...
- 第九章 springboot + mybatis + 多数据源 (AOP实现)(转载)
本编博客转发自:http://www.cnblogs.com/java-zhao/p/5415896.html 1.ShopDao package com.xxx.firstboot.dao; imp ...