forked from XPoet/js-data-structure-and-algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
set.js
106 lines (84 loc) · 2.49 KB
/
set.js
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// 集合结构的封装
export default class Set {
constructor() {
this.items = {};
}
// has(value) 判断集合中是否存在 value 值,存在返回 true,否则返回 false
has(value) {
return this.items.hasOwnProperty(value);
}
// add(value) 往集合中添加 value
add(value) {
if (this.has(value)) return false;
this.items[value] = value;
return true;
}
// remove(value) 删除集合中指定的 value
remove(value) {
// 如果集合不存在该 value,返回 false
if (!this.has(value)) return false;
delete this.items[value];
}
// clear() 清空集合中所有 value
clear() {
this.items = {};
}
// size() 获取集合中的 value 个数
size() {
return Object.keys(this.items).length;
}
// values() 获取集合中所有的 value
values() {
return Object.keys(this.items);
}
// ------- 集合间的操作 ------- //
// union() 求两个集合的并集
union(otherSet) {
// 1、创建一个新集合
let unionSet = new Set();
// 2、将当前集合(this)的所有 value,添加到新集合(unionSet)中
for (let value of this.values()) {
unionSet.add(value);
}
// 3、将 otherSet 集合的所有 value,添加到新集合(unionSet)中
for (let value of otherSet.values()) {
unionSet.add(value); // add() 已经有重复判断
}
return unionSet;
}
// intersection() 求两个集合的交集
intersection(otherSet) {
// 1、创建一个新集合
let intersectionSet = new Set();
// 2、从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在
for (let value of this.values()) {
if (otherSet.has(value)) {
intersectionSet.add(value);
}
}
return intersectionSet;
}
// difference() 差集
difference(otherSet) {
// 1、创建一个新集合
let differenceSet = new Set();
// 2、从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在,不存在的即为差集
for (let value of this.values()) {
if (!otherSet.has(value)) {
differenceSet.add(value);
}
}
return differenceSet;
}
// subset() 子集
subset(otherSet) {
// 从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在,有不存在的返回 false
// 遍历完所有的,返回 true
for (let value of this.values()) {
if (!otherSet.has(value)) {
return false;
}
}
return true;
}
}