6JavaScript数据结构与算法--集合

版权声明:本文为作者的原创文章,未经允许不得转载。 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));

打印值:

。。。

猜你喜欢

转载自blog.csdn.net/lin5165352/article/details/81542147