除了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方法遍歷,並且根據結果可以看出,每次輸出結果順序也是不一樣的