java類集開發中一對多和多對多的關系的實現


摘自《java開發實戰經典》李興華.著

一對多的關系

一個學校可以包含多個學生,一個學生屬於一個學校,那么這就是一個典型的一對多關系,此時就可以通過類集進行關系的表示。

在定義Student類中包含了一個School屬性,表示一個學生屬於一個學校。在程序運行時,只需要傳入School類的引用就可以完成這樣的關系。

在定義School類時定義了一個List類型的屬性,並指定其泛型類型是Student類型,這樣一來就表示在一個School對象中會包含多個Student類型的引用。

最后在主函數設置學校和學生的對應關系。也可以用Map來實現學校映射學生的list集合之間的關系。

 1 import java.util.*;
 2 public class TestDemo{//設置學校和學生的關系
 3     public static void main(String args[]){
 4         School sch = new School("清華大學") ;//實例化學校對象
 5         Student s1 = new Student("張三",21) ;//實例化學生對象
 6         Student s2 = new Student("李四",22) ;
 7         Student s3 = new Student("王五",23) ;
 8         sch.getAllStudents().add(s1) ;//在學校中加入學生
 9         sch.getAllStudents().add(s2) ;
10         sch.getAllStudents().add(s3) ;
11         s1.setSchool(sch) ;//一個學生屬於一個學校  
12         s2.setSchool(sch) ;
13         s3.setSchool(sch) ;
14         System.out.println(sch) ;
15         Iterator<Student> iter = sch.getAllStudents().iterator() ;
16         while(iter.hasNext()){
17             System.out.println("\t|- " + iter.next()) ;
18         }
19     }
20 }
21 
22 //學生類
23 class Student{
24     private String name ;
25     private int age ;
26     private School school; // 一個學生屬於一個學校
27     public Student(String name,int age){
28         this.setName(name) ;
29         this.setAge(age) ;
30     }
31     public void setSchool(School school){
32         this.school = school ;
33     }
34     public School getSchool(){
35         return this.school ;
36     }
37     public void setName(String name){
38         this.name = name ;
39     }
40     public void setAge(int age){
41         this.age = age ;
42     }
43     public String getName(){
44         return this.name; 
45     }
46     public int getAge(){
47         return this.age ;
48     }
49     public String toString(){
50         return "學生姓名:" + this.name + ";年齡:" + this.age ;
51     }
52 }
53 
54 //學校類
55 class School{
56     private String name ;
57     private List<Student> allStudents ;//一個學校有多個學生  
58     public School(String name){
59         this.allStudents = new ArrayList<Student>(); 
60         this.setName(name) ;
61     }
62     public void setName(String name){
63         this.name = name ;
64     }
65     public String getName(){
66         return this.name; 
67     }
68     public List<Student> getAllStudents(){//取得全部的學生  
69         return this.allStudents ;
70     }
71     public String toString(){
72         return "學校名稱:" + this.name ;
73     }
74 }

多對多關系

使用類集不僅可以表示出一對一的關系,也可以表示出多對多的關系。例如,一個學生可以選多門課程,一門課程可以有多個學生參加,那么這就是一個典型的多對多關系。

要完成本程序,首先應該定義兩個類:學生信息類Student、課程信息類Course。在一個學生類中存在一個集合,保存全部的課程;而在課程類中也要存在一個集合,保存全部的學生。

  1 import java.util.*;  
  2  // 定義學生類 
  3 class Student {    
  4         private String name ; 
  5         private int age ;    
  6         private List<Course> allCourses ;   // 定義集合保存全部課程  
  7         public Student(){// 無參構造  
  8             this.allCourses = new ArrayList<Course>() ;// 實例化List集合  
  9         }  
 10         public Student(String name,int age){ // 通過構造設置屬性內容  
 11             this() ; // 調用無參構造  
 12             this.setName(name) ;   // 設置name屬性內容  
 13             this.setAge(age) ; // 設置age屬性內容  
 14         }  
 15         public String getName() {
 16             return name;  
 17         }  
 18         public void setName(String name) {
 19             this.name = name;  
 20         }  
 21         public int getAge() {
 22             return age;  
 23         }  
 24         public void setAge(int age) {
 25             this.age = age;  
 26         }  
 27         public List<Course> getAllCourses() { // 取得全部課程  
 28             return allCourses;  
 29         }  
 30         public String toString(){ // 覆寫toString()方法  
 31             return "學生姓名:" + this.name + ";年齡:" + this.age ;  
 32         }  
 33     } 
 34 
 35 
 36 //在學生類中存在一個allCourses的List集合,這樣在程序運行時,一個學生類中可以保存多個Course對象。
 37 
 38 //定義課程類
 39 class Course {  
 40         private String name ;   // 
 41         private int credit ;      // 定義學分  
 42         private List<Student> allStudents ; // 定義集合保存多個學生  
 43         public Course(){    // 無參構造方法  
 44             this.allStudents = new ArrayList<Student>() ;// 實例化List集合  
 45         }  
 46         public Course(String name,int credit){   // 
 47             this() ;  
 48             this.setName(name) ; 
 49             this.setCredit(credit) ;   
 50         }  
 51         public String getName() {   
 52             return name;  
 53         }  
 54         public void setName(String name) {    
 55             this.name = name;  
 56         }  
 57         public int getCredit() {     
 58             return credit;  
 59         }  
 60         public void setCredit(int credit) {  
 61             this.credit = credit;  
 62         }  
 63         public List<Student> getAllStudents() {  // 得到全部學生  
 64             return allStudents;  
 65         }  
 66         public void setAllStudents(List<Student>allStudents) {// 設置全部學生  
 67             this.allStudents = allStudents;  
 68         }  
 69         public String toString(){   
 70             return "課程名稱:" + this.name + ";課程學分" + this.credit ;  
 71         }  
 72     } 
 73 
 74 //課程類與學生類一樣,都定義了一個List集合,用於保存多個學生信息。
 75 
 76 
 77 
 78    
 79     public class TestMore {  
 80         public static void main(String args[]) {  
 81             Course c1 = new Course("英語", 3); // 實例化課程對象  
 82             Course c2 = new Course("計算機", 5); 
 83             Student s1 = new Student("張三", 20);  // 實例化學生對象  
 84             Student s2 = new Student("李四", 21);  
 85             Student s3 = new Student("王五", 22);   
 86             Student s4 = new Student("趙六", 23); 
 87             Student s5 = new Student("孫七", 24);  
 88             Student s6 = new Student("錢八", 25);  
 89             // 第一門課程有3個人參加,向課程中增加3個學生信息,同時向學生中增加課程信息  
 90             c1.getAllStudents().add(s1);  // 向課程增加學生信息  
 91             c1.getAllStudents().add(s2);  
 92             c1.getAllStudents().add(s6); 
 93             s1.getAllCourses().add(c1);  // 向學生中增加課程信息  
 94             s2.getAllCourses().add(c1);  
 95             s6.getAllCourses().add(c1);
 96             // 第二門課程有6個人參加,向課程中增加6個學生信息,同時向學生中增加課程信息  
 97             c2.getAllStudents().add(s1); // 向課程增加學生信息  
 98             c2.getAllStudents().add(s2);    
 99             c2.getAllStudents().add(s3);
100             c2.getAllStudents().add(s4); 
101             c2.getAllStudents().add(s5); 
102             c2.getAllStudents().add(s6); 
103             s1.getAllCourses().add(c2);// 向學生中增加課程信息  
104             s2.getAllCourses().add(c2);
105             s3.getAllCourses().add(c2); 
106             s4.getAllCourses().add(c2);  
107             s5.getAllCourses().add(c2); 
108             s6.getAllCourses().add(c2); 
109             // 輸出一門課程的信息,觀察一門課程有多少個學生參加  
110             System.out.println(c1); // 輸出第一門課程信息  
111             Iterator<Student> iter1 = c1.getAllStudents().iterator();  
112             while (iter1.hasNext()) { // 迭代
113                 Student s = iter1.next();// 取出學生對象  
114                 System.out.println("\t|- " + s); // 輸出學生信息  
115             }  
116             // 輸出一個學生參加的課程信息,觀察有多少門課程  
117             System.out.println(s6); // 輸出學生信息  
118             Iterator<Course> iter2 = s6.getAllCourses().iterator();  
119             while (iter2.hasNext()) {  // 迭代
120                 Course c = iter2.next(); // 取得所參加的課程  
121                 System.out.println("\t|- " + c); // 輸出課程信息  
122             }  
123         }  
124     }
125 ---------- java ----------
126 課程名稱:英語;課程學分3
127     |- 學生姓名:張三;年齡:20
128     |- 學生姓名:李四;年齡:21
129     |- 學生姓名:錢八;年齡:25
130 學生姓名:錢八;年齡:25
131     |- 課程名稱:英語;課程學分3
132     |- 課程名稱:計算機;課程學分5
133 
134 輸出完成 (耗時 0 秒) - 正常終止

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM