Java中Set集合的使用


  除了List之外,Set集合接口也經常使用,Set接口中存放的元素是無序的並且是不可重復的,因此被稱為數據集;

  Set接口因為是無序的,所以沒有提供像List一樣的set方法來修改元素,查找,添加、刪除是沒問題的

  下面利用Set來演示一下學生選課的簡單示例:

  課程類,Course.java

 1 /*
 2  * 課程類,規定課程結構,用於向集合中傳入此類型的元素
 3  */
 4 
 5 public class Course {
 6     public String id;
 7     public String name;
 8     public Course(String id,String name){
 9         //含參構造方法
10         this.id = id;
11         this.name = name;
12     }
13     
14     public Course(){
15         //無參構造器,為了子類初始化隱式構造方法
16     }
17 }

  學生類,包括學號、屬性、所選課程(利用Set集合存放),Student.java

 1 import java.util.HashSet;
 2 import java.util.Set;
 3 
 4 /*
 5  * 學生類
 6  */
 7 
 8 public class Student {
 9     public String id;
10     public String name;
11     public Set<Course> courses;    //定義Set類型的集合用於存放所選課程
12     
13     public Student(String id,String name){
14         this.id = id;
15         this.name = name;
16         this.courses = new HashSet<Course>();    //通過HashSet方法實例化Set類型的引用
17     }
18 }

  同樣利用了泛型,規定了Set集合存放學生所選的課程屬性的類型

  操作Set集合的類,SetTest.java

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.List;
 4 import java.util.Scanner;
 5 
 6 public class SetTest {
 7     
 8     public List<Course> coursesToSelect;
 9     public SetTest(){
10         this.coursesToSelect = new ArrayList<Course>();
11     }
12     public void testAdd(){
13         Course cr1 = new Course("1","數據結構");
14         coursesToSelect.add(cr1);    //添加屬性到List中,位置0
15         
16         Course cr2 = new Course("2","C語言");
17         coursesToSelect.add(1,cr2);
18 
19         
20         Course[] course = {new Course("3","離散數學"),new Course("4","匯編語言")};    //創建一個課程類數組,存放多個對象
21         coursesToSelect.addAll(Arrays.asList(course));    //把數組轉成List傳遞到courseToSelect屬性中
22         
23         Course[] course2 = {new Course("5","高等數學"),new Course("6","算法分析")};
24         coursesToSelect.addAll(4,Arrays.asList(course2));
25     }
26     
27     /*
28      * 遍歷List中的元素
29      */
30     public void testForeach(){
31         System.out.println("所有課程:");
32         for(Course cr : this.coursesToSelect){
33             System.out.println("課程:" + cr.id + ":" + cr.name);
34         }
35     }
36     
37     public static void main(String[] args){
38         SetTest st = new SetTest();
39         st.testAdd();
40         st.testForeach();
41         
42         //創建學生對象
43         Student stu = new Student("201201100838","小穎");
44         System.out.println("歡迎你!" + stu.name + "  學號:" + stu.id);
45         
46         //接收課程輸入
47         Scanner console = new Scanner(System.in);
48         
49         for(int i = 0;i < 3;i++){
50             System.out.println("請輸入課程ID:");
51             String courseid = console.next();
52             //遍歷比對
53             for(Course cr : st.coursesToSelect){
54                 if(cr.id.equals(courseid)){
55                     stu.courses.add(cr);    //添加所選課程
56                     
57                     
58                     //重復添加不生效,相當於沒添加,多個相同對象引用只保留一個
59                     stu.courses.add(cr);
60                     
61                     //stu.courses.add(null);    //傳入空值也是可以的
62                 }
63             }
64         }
65         console.close();    //關閉輸入
66         int num = stu.courses.size();
67         System.out.println("共選了" + num + "門課程,列表如下:");
68         st.SetForeach(stu);
69         
70         
71         
72     }
73     
74     /*
75      * 遍歷Set中的元素只能用foreach方法或者迭代器方法,不能用get方法,因為Set中元素排列是無序的,不可能根據索引查詢
76      * 並且最終每次輸出也是無序的
77      */
78     
79     public void SetForeach(Student stu){
80         for(Course cr:stu.courses){
81             System.out.println(cr.id + ":" + cr.name);
82         }
83     }
84 }

  上面的程序就可以實現選課的簡單功能,首先初始化備選課程放入List中,然后進行輸入比對,存入學生類中Set中,然后利用foreach遍歷出Set中的結果,實現的選課內容的輸出,效果如下:

  

  Set接口使用和List基本一致,顯著特點就是Set中的元素無序並且不可重復,需要注意的地方就是,例子中對對象進行了重復添加,但是沒有任何作用,重復添加多個相同對象時,Set中只保留一個,另外添加null空指針也是可以的;Set中元素因為其無序性,所以不能用get方法來查找,只能通過foreach或者iterator方法遍歷,並且根據結果可以看出,每次輸出結果順序也是不一樣的

 


免責聲明!

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



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