版权声明:本文为作者的原创文章,未经允许不得转载。 https://blog.csdn.net/lin5165352/article/details/81542147
集合一个数学概念:由一组无序且唯一的项构成。
javascript(ES5.1)实现集合。实现以下方法。
- has(value)方法:是否包含该值。
- add(value)方法:添加一个值。
- remove(value)方法:删除一个值。
- clear()方法:清除所有值。
- size()方法:返回长度。
- values()方式:返回包含所有值的一个数组。
- union 并集: 存在于A 或者 存在于B,A∪B 。
- intersection 交集:存在于 A 且 存在于B。
- difference 差集: 存在于 A 且 不存在于B。(A 是 this)
- subset 子集:A存在于B中。B包含A。(A 是 this)
function Set() {
let items = {};
this.items = items;
this.has = function (value) {
return items.hasOwnProperty(value);
};
this.add = function (value) {
if(!this.has(value)){
items[value] = value;
return true;
}else{
return false;
}
};
this.remove = function (value) {
if(this.has(value)){
delete items[value];
return true;
}else {
return false;
}
};
this.clear = function () {
items = {};
};
this.size = function () {
let count = 0;
for(let key in items){
if(items.hasOwnProperty(key))
++count;
}
return count;
};
this.values = function () {
let values = [];
for (let key in items){
if(items.hasOwnProperty(key)){
values.push(items[key]);
}
}
return values;
};
//并集 ∪
this.union = function (otherset) {
let unionset = new Set();
let values = this.values();
for (let i = 0;i<values.length;i++){
unionset.add(values[i]);
}
values = otherset.values();
for(let i=0;i<values.length;i++){
unionset.add(values[i]);
}
return unionset;
};
//交集 ∩
this.intersection = function (otherset) {
let intersectionSet = new Set();
let values = this.values();
for(let i = 0;i<values.length;i++){
if(otherset.has(values[i])){
intersectionSet.add(values[i]);
}
}
return intersectionSet;
};
//差集
this.difference = function (otherSet) {
let differenceSet = new Set();
let values = this.values();
for(let i=0;i<values.length;i++){
if (!otherSet.has(values[i])){
differenceSet.add(values[i]);
}
}
return differenceSet;
};
//子集 this是 otherset 的子集
this.subset = function (otherset) {
if(this.size() > otherset.size()){
return false;
}else{
let values = this.values();
for (let i=0; i<values.length;i++){
if(!otherset.has(values[i])){
return false;
}
}
return true;
}
};
}
let set1 = new Set();
set1.add("a1");
set1.add("a2");
set1.add("a3");
set1.add("a4");
console.log(set1.values());
let set2 = new Set();
set2.add("a1");
set2.add("a2");
set2.add("a3");
set2.add("a4");
set2.add("s1");
set2.add("s2");
console.log(set2.values());
let set12 = set1.union(set2);
console.log(set12.values());
let set1s2 = set1.intersection(set2);
console.log(set1s2.values());
console.log(set1.difference(set2).values());
console.log(set1.subset(set2));
console.log(set1);得到下面的结果,输出的是一个Object对象.
ES6 中的Set类
在es2105中增加了Set类。我们可以在次基础上补充我们的Set类。实现了并集、交集、差集和子集。
在ES6中Set为内置对象,会直接打印出Set对象。
代码:
let set1 = new Set();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(4);set1.add('a');set1.add('b');
let values = set1.values();
for(let i=0;i<set1.size;i++){
console.log(values.next());
}
console.log(set1);
let set2 = new Set();
set2.add(2);
set2.add(3);
set2.add(4);
set2.add(5);
console.log(set2);
console.log(unionAB(set1,set2));
function unionAB(setA,setB) {
let setAB = new Set();
for(x of setA){
setAB.add(x);
}
for(x of setB){
setAB.add(x)
}
return setAB;
}
let intersection = function (setA,setB) {
let setAB = new Set();
for(let x of setA){
if(setB.has(x)){
setAB.add(x);
}
}
return setAB;
};
console.log(intersection(set1,set2));
let difference = function (set1, set2) {
let setAB = new Set();
for(let x of set1){
if(!set2.has(x)){
setAB.add(x);
}
}
return setAB;
};
let diff = difference(set1,set2);
console.log(diff);//怎么拼接字符串? '差集'+diff
function subset(set1,set2) {
if(set1.size>set2.size){
return false;
}else{
for(let x of set1){
if(!set2.has(x)){
return false;
}
}
return true;
}
}
console.log(subset(set1,set2));
打印值:
。。。