集合运算
date
Mar 18, 2023
slug
js-set-operation
status
Published
tags
JavaScript数据结构与算法
Set
JavaScript
summary
Set Operation in JavaScript
type
Post
集合运算
并集
并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
首先创建一个新的集合,代表两个集合的并集。接下来,获取第一个集合所有的值( values ),迭代并全部添加到代表并集的集合中。将第一个集合中的所有值迭代加入第二个集合中。
union(otherSet){
const unionSet = new Set();
this.values().forEach( value => {
unionSet.add(value);
})
otherSet.values().forEach( value => {
unionSet.add(value);
})
return unionSet;
}
若不是用 forEach 方法,则使用for循环遍历所有值
union(otherSet){
const 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;
}
接下来测试并集:
const setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
const setB = new Set();
setB.add(3);
setB.add(4);
setB.add(5);
setB.add(6);
const unionAB = setA.union(setB);
console.log(unionAB.values());
//[1,2,3,4,5,6]
交集
交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。
创建一个新的 Set 实例( intersectionSet ),用它返回共有的元素。迭代 当前 Set 实例(集合A)所有的值,验证它们是否也存在于 otherSet 实例(集合B)之中。
has(element){
return element in items;
}
intersection(otherSet){
const intersectionSet = new Set();
const values = this.values();
for(let i = 0; i < values.length; i++){
if(otherSet.has(values[i])){
intersectionSet.add(values[i]);
}
}
return intersectionSet;
}
测试交集:
const setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
const setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);
const intersectionAB = setA.intersection(setB);
console.log(intersectionAB.values());
//[2,3]
优化
使用元素少的集合进行迭代比较
intersection(otherSet) {
const intersectionSet = new Set();
const values = this.values();
const otherValues = otherSet.values();
let biggerSet = values;
let smallerSet = otherValues;
if (otherValues.length - values.length > 0) {
biggerSet = otherValues;
smallerSet = values;
}
smallerSet.forEach(value => {
if (biggerSet.includes(value)) {
intersectionSet.add(value);
}
});
return intersectionSet;
}
差集
差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集 合的元素的新集合。
创建结果集合,因为不想修改原来的集合。迭代集合中的所有值。检查当前值(元素)是否存在于给定集合中,如果不存在于 otherSet 中,则将此值加入结果集合中。
difference(otherSet){
const differenceSet = new Set();
this.values().forEach( value => {
if(!otherSet.has(value){
differenceSet.add(value);
}
})
return differenceSet;
}
创建差集测试
const setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
const setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);
const differenceAB = setA.difference(setB);
console.log(differenceAB.values());
子集
子集:验证一个给定集合是否是另一集合的子集。
验证的是当前 Set 实例的大小。如果当前实例中的元素比 otherSet 实例更多, 它就不是一个子集。
假定当前实例是给定集合的子集,迭代当前集合的所有元素,验证这些元素也存在于 otherSet 中。如果有任何元素不存在于 otherSet 中, 就意味着它不是一个子集,返回 false。如果所有元素都存在于 otherSet 中,返回 true。
isSubsetOf(otherSet){
if(this.size() > otherSet.size()){
return false;
}
let isSubset = true;
this.values().every( value => {
if(!otherSet.has(value)){
isSubset = false;
return false;//使用every,返回false循环停止
}
return true;
})
return isSubset;
}