1.什么是集合
集合是由一组无序且唯一的项组成的。你也可以把几个想象成一个既没有重复元素,也没有顺序概念的数组。
2.集合的方法
首先我们创建一个类来表示栈:
class mySet {
constructor() {
this.items = {};
}
}
上述代码中我们通过对象表示集合,接下来还需要声明一些集合里面可用的方法:
add(item): 向集合中添加一个新元素。
delete(item): 删除集合中对应的元素。
has(item): 判断集合中是否已存在目标元素,若存在返回true,反之返回false。
values(): 返回一个包含集合中所有元素的数组。
clear(): 移除集合内的所有元素。
size(): 返回集合内元素的数量。
现在我们可以这样表示集合:
class myStack {
constructor() {
this.items = {};
}
add(item) {}
delete(item) {}
has(item) {}
values() {}
clear() {}
size() {}
}
3.集合的实现
has方法,这里我们采用Object的hasOwnProperty方法判断:
has(item) {
return Object.prototype.hasOwnProperty.call(this.items, item);
}
add方法,插入成功返回true,插入失败返回false:
add(item) {
if (!this.has(item)) {
this.items[item] = item;
return true;
}
return false;
}
delete方法,删除成功返回true,删除失败返回false:
delete(item) {
if (this.has(item)) {
delete this.items[item];
return true;
}
return false;
}
clear方法:
clear() {
this.items = {};
}
size方法,通过Object.keys()方法获取元素个数:
size() {
// let count = 0;
// for...in 会遍历原型链上的属性
// for (item in this.items) {
// if (this.has(item)) {
// count++;
// }
// }
// return count;
return Object.keys(this.items).length;
}
values方法:
values() {
return Object.keys(this.items);
}
综上,集合完整代码如下:
class myStack {
constructor() {
this.items = {};
}
add(item) {
if (!this.has(item)) {
this.items[item] = item;
return true;
}
return false;
}
delete(item) {
if (this.has(item)) {
delete this.items[item];
return true;
}
return false;
}
has(item) {
return Object.prototype.hasOwnProperty.call(this.items, item);
}
values() {
return Object.keys(this.items);
}
clear() {
this.items = {};
}
size() {
// let count = 0;
// for...in 会遍历原型链上的属性
// for (item in this.items) {
// if (this.has(item)) {
// count++;
// }
// }
// return count;
return Object.keys(this.items).length;
}
}
4.集合的运用
4.1 交集
insterserction(otherSet) {
const newSet = new mySet();
this.values().forEach(value => {
if (otherSet.has(value)) {
newSet.add(value);
}
})
return newSet;
}
4.2 并集
union(otherSet) {
const newSet = new mySet();
this.values().forEach(value => {
newSet.add(value);
})
otherSet.forEach(value => {
newSet.add(value);
})
return newSet;
}
4.3 差集
difference(otherSet) {
const newSet = new mySet();
this.values().forEach(value => {
if (!otherSet.has(value)) {
newSet.add(value);
}
})
return newSet;
}
4.4 子集
isSubsetOf(otherSet) {
if (this.size() > otherSet.size()) {
return false;
}
let isSubset = true;
this.values().forEach(value => {
if (!otherSet.has(value)) {
isSubset = false;
}
})
return isSubset;
}