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 }