# Set(集)接口,及其实现类 —— HashSet
Set是元素无序,并且不可以重复的集合,被称为集。
HashSet:哈希集,是Set的一个重要实现类。
案例功能说明
提供备选课程
创建学生对象,并给该学生添加三门课程(添加在学生的courses——Set类型的属性中) :::
显示备选课程 :::
循环三次,每次输入课程ID :::
往学生的Courses属性中添加与输入的ID匹配的课程 :::
输出学生选课的课程 :::
Student类
import java.util.HashSet;
import java.util.Set;
/**
* 学生类
* @author capricorncd
*
*/
public class Student {
public int id;
public String name;
public Set<Course> courses;
public Student (int id, String name) {
this.id = id;
this.name = name;
// 初始化
this.courses = new HashSet<Course>();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
TestSet类
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class TestSet {
public List<Course> coursesToSelect;
// constructor
public TestSet() {
coursesToSelect = new ArrayList<Course>();
}
/**
* System.out.println
* @param str
*/
public static void print(String str) {
System.out.println(str);
}
/**
* 通过for each方法访问集合元素
*/
public void testForEach() {
print("-------------- testForEach ---------------");
print("有以下课程待选(通过forEach访问):");
for (Object obj : coursesToSelect) {
Course cr = (Course) obj;
print("Course: " + cr.id + " " + cr.name);
}
print("-------------- 华丽的分割线 ---------------");
}
/**
* 添加备课程
*/
public void testAdd() {
coursesToSelect.add(new Course(1, "数据结构"));
coursesToSelect.add(new Course(2, "C语言"));
// 批量添加课程
Course[] courses = { new Course(3, "离散数学"), new Course(4, "汇编语言"), new Course(5, "高等数学"), new Course(6, "GoLang") };
coursesToSelect.addAll(Arrays.asList(courses));
}
/**
* 遍历输出学生的课程
* @param student
*/
public void forEachForSet(Student student) {
print(student.name + "成功选择了" + student.courses.size() + "门课程!");
for (Course cr : student.courses) {
print(cr.id + ":" + cr.name);
}
}
public static void main(String[] args) {
TestSet ts = new TestSet();
ts.testAdd();
ts.testForEach();
// 创建一个学生对象
Student student = new Student(1, "John");
print("欢迎学生:" + student.name + "选课!");
// 创建一个Scanner对象,用来接收从键盘输入的课程ID
Scanner input = new Scanner(System.in);
// 循环三次,每次输入课程ID
for (int i = 0; i < 3; i++) {
System.out.print("请输入课程ID: ");
Integer courseID = new Integer(input.next());
for (Course cr : ts.coursesToSelect) {
// if (cr.id.equals(courseID)) { // 字符串比较
if (cr.id == courseID) {
// 往学生的Courses属性中添加与输入的ID匹配的课程
student.courses.add(cr);
}
}
}
// 输出学生选课的课程
ts.forEachForSet(student);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
注意
Set 只能使用 foreach或iterator遍历,不能像List那样使用get()方法。
因为Set是无序的,不能通过索引去查找元素,只能通过foreach或iterator一个个循环迭代出来。而且每次迭代出来的结果顺序都可能不同。 :::
Set中可以添加 null
空对象,不过在实际应用中不常见。
:::
# 代码
https://github.com/capricorncd/Java-Notes/tree/master/codes/collection-and-map/src/com/test/collection
← 泛型 Map & HashMap →