数据结构-javascript实现【集合】


集合是由一组无序且唯一的项组成的。

1.集合的职责方法

add(value): 向集合中添加新的项

remove(value): 从集合中移除一个值

has(value): 检查集合中是否有该值

clear(): 清空集合

size(): 返回集合中项目的个数

values(): 返回集合中所有项的数组

union(otherSet): 返回与另一个集合的并集的集合

intersection(otherSet): 返回与另一个集合的交集的集合

differrence(otherSet): 返回与另一个集合差集的集合

subset(otherSet): 检查是否是另一个集合的子集

2.集合的实现

class Set {
  constructor(){
    this.items = {};
  }

  has(value){
    return this.items.hasOwnProperty(value);
  }

  add(value) {
    if(!this.has(value)){
      this.items[value] = value;
      return true;
    }
    return false;
  }

  remove(value){
    if(this.has(value)){
      delete this.items[value];
      return true;
    }
    return false;
  }

  union(otherSet) {
    const unionSet = new Set();
    const values = this.values();
    for(let i = 0; i< values.length; i++){
      unionSet.add(values[i]);
    }

    const otherValues = otherSet.values();
    for(let i = 0; i< otherValues.length; i++){
      unionSet.add(otherValues[i]);
    }
    return unionSet;
  }

  intersection(otherSet) {
    const intersectionSet = new Set();
    const values = this.values();
    for(let i =0; i){
      if(otherSet.has(values[i])){
        intersectionSet.add(values[i]);
      }
    }
    return intersectionSet;
  }

  difference(otherSet){
    const differenceSet = new Set();
    const values = this.values();
    for (let i =0; i){
      if(!otherSet.has(values[i])){
        differenceSet.add(values[i]);
      }
    }
    return differenceSet;
  }

  subset(otherSet) {
    if(this.size() > otherSet.size()) return false;
    const values = this.values();
    for (let i = 0; i < values.length; i++){
      if(!otherSet.has(values[i])){
        return false;
      }
    }
    return true;
  }

  clear(){
    this.items = {};
  }

  size() {
    return Object.keys(this.items).length;
  }

  values() {
    return Object.values(this.items);
  }
}

const set = new Set();
set.add(1);
set.add(2);
console.log(set.values());// [1, 2]
console.log(set.has(1)); // true
console.log(set.size()); // 2
set.remove(1);
console.log(set.values()); // [2]

const setA = new Set();
setA.add(1);
setA.add(2);
const setB = new Set();
setB.add(3);
setB.add(4);
const unionAB = setA.union(setB);
console.log(unionAB.values()); // [1,2,3,4]

const setC = new Set();
setC.add(1);
setC.add(2);
const setD = new Set();
setD.add(2);
setD.add(3);
const intersectionCD = setC.intersection(setD);
console.log(intersectionCD.values()); // [2]
const differenceCD = setC.difference(setD);
console.log(differenceCD.values()); // [1]
const setE = new Set();
setE.add(1);
console.log(setE.subset(setC));
console.log(setE.subset(setD));