Java集合中Set的常见问题及用法

在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法。

Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称为集。它有一个重要的实现类HashSet--哈希集。Set只能使用foreach或Iterator迭代器进行遍历,Set中添加某个对象,无论添加多少次,最终只会保留一个该对象的引用,并且保留的是第一次添加的那一个。

下面我们可以用添加学生课程的案例显示Set的用法:

创建一个学生类Student

 1 import java.util.HashSet;
 2 import java.util.Set;
 3 
 4 /**
 5  * 学生类
 6  * @author lenovo
 7  *
 8  */
 9 public class Student {
10 
11     public String id;
12     
13     public String name;
14     
15     public Set<KeCheng> kecheng;
16     
17     public Student(String id,String name){
18         this.id = id;
19         this.name = name;
20         this.kecheng = new HashSet<KeCheng>();
21     }
22     
23 }

创建一个SetTest的演示类

 1 package collection;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Scanner;
 6 
 7 public class SetTest {
 8 
 9     public List<KeCheng> kcList;
10     
11     public SetTest(){
12         this.kcList = new ArrayList<KeCheng>();
13     }
14     
15     /*
16      * 增加课程的方法
17      */
18     public void addKC(){
19         KeCheng kc = new KeCheng("1","大学语文");
20         kcList.add(kc);
21         KeCheng kc2 = new KeCheng("2","大学英语");
22         kcList.add(kc2);
23         KeCheng kc3 = new KeCheng("3","高等数学");
24         kcList.add(kc3);
25     }
26     
27     /*
28      * 使用for each遍历课程
29      */
30     public void testForeach(){
31         System.out.println("使用for each遍历课程:");
32         for(Object obj : kcList){
33             KeCheng kc = (KeCheng)obj;
34             System.out.println("课程:"+kc.id+":"+kc.name+";");
35         }
36     }
37     
38     /*
39      * 遍历学生选的课程
40      */
41     public void testStuKC(Student s){
42         System.out.println(s.name+"选择了"+s.kecheng.size()+"门课程:");
43         for(KeCheng kc:s.kecheng){
44             System.out.println("课程ID:"+kc.id+":"+kc.name+";");
45         }
46     }
47     
48     
49     public static void main(String[] args) {
50         
51         //实例化SetTest对象,执行添加课程、遍历课程的方法
52         SetTest st = new SetTest();
53         st.addKC();
54         st.testForeach();
55         
56         
57         //实例化学生的一个对象
58         Student stu = new Student("1","Tom");
59         
60         //使用扫描器添加学生选课的ID
61         Scanner sc = new Scanner(System.in);
62         
63         for (int i = 0; i < 3; i++) {
64             System.out.println("请输入课程ID:");
65             String kcid = sc.next();
66             
67             //遍历课程的List
68             for(KeCheng kc:st.kcList){
69                 
70                 //判断添加的课程ID在List中是否存在
71                 if(kc.id.equals(kcid)){
72                     /*
73                      * Set中,添加某个对象,无论添加多少次,
74                      * 最终只会保留一个该对象的引用,
75                      * 并且保留的是第一次添加的那一个
76                      */
77                     stu.kecheng.add(kc);
78                 }
79             }
80             
81         }
82         
83         //遍历学生所选的课程
84         st.testStuKC(stu);
85     }
86     
87 }

运行上面的代码,显示结果为:

使用for each遍历课程:
课程:1:大学语文;
课程:2:大学英语;
课程:3:高等数学;
请输入课程ID:
1
请输入课程ID:
2
请输入课程ID:
3
Tom选择了3门课程:
课程ID:1:大学语文;
课程ID:2:大学英语;
课程ID:3:高等数学;

删除学生所选课程 ,使用迭代器删除,用foreach会报错

 1         /*
 2          * 删除课程
 3          */
 4         Iterator it = stu.kecheng.iterator();
 5         while(it.hasNext()){
 6             KeCheng kc = (KeCheng) it.next();
 7             if(kc.name.equals("大学语文")){
 8                 it.remove();
 9             }
10         }
原文地址:https://www.cnblogs.com/jpwz/p/5680284.html