数据结构与算法--集合(Set)--JS

Posted 煜成'Studio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法--集合(Set)--JS相关的知识,希望对你有一定的参考价值。

数据结构与算法–集合(Set)–JS

集合比较常用的实现方式是哈希表,这里来实现一个封装的集合类
集合通常是一组无序的、不能重复的元素构成

//封装集合类
function Set() {
    //属性
    this.items = {};
    //方法
    //add方法
    Set.prototype.add = function (value) {
        //判断当前集合中是否已经包含了该元素
        if (this.has(value)) {
            return false;
        }
        //将元素添加到集合中
        this.items[value] = value;
        return true;
    }

    //has方法
    Set.prototype.has = function (value) {
        return this.items.hasOwnProperty(value);
    }

    //remove方法
    Set.prototype.remove = function (value) {
        //判断该集合是否包含该元素
        if (!this.has(value)) {
            return false;
        }
        //将元素从属性中删除
        delete this.items[value];
        return true;
    }

    //clear方法
    Set.prototype.clear = function () {
        this.items = {};
    }

    //size方法
    //下面两个方法也需要考虑兼容性问题
    Set.prototype.size = function () {
        return Object.keys(this.items).length;
    }

    //获取集合中所有的值
    Set.prototype.values = function () {
        return Object.keys(this.items);
    }

    //集合间的操作
    //并集
    Set.prototype.union = function (otherSet) {
        //this: 集合对象A
        //otherSet: 集合对象B
        //创建新的集合
        var unionSet = new Set();
        //将A集合中所有的元素添加到新集合中
        var values = this.values();
        for (var i = 0; i < values.length; i++) {
            unionSet.add(values[i]);
        }
        //取出B集合中的元素,判断是否需要加到新集合
        values = otherSet.values();
        for (var i = 0; i < values.length; i++) {
            unionSet.add(values[i]);
        }
        return unionSet;
    }

    //交集
    Set.prototype.intersection = function (otherSet) {
        //this:集合A
        //otherSet:集合B
        //创建新的集合
        var intersectionSet = new Set();
        var values = this.values();
        //判断
        for (var i = 0; i < values.length; i++) {
            var item = values[i];
            if (otherSet.has(item)) {
                intersectionSet.add(item);
            }
        }
        return intersectionSet;
    }

    //差集
    Set.prototype.difference = function (otherSet) {
        //this:集合A
        //otherSet:集合B
        //创建新的集合
        var difference = new Set();
        //判断
        var values = this.values();
        for (var i = 0; i < values.length; i++) {
            var item = values[i];
            if (!otherSet.has(item)) {
                difference.add(item);
            }
        }
        return difference;
    }

    //子集
    Set.prototype.subset = function (otherSet) {
        //this:集合A
        //otherSet:集合B
        var values = this.values();
        for (var i = 0; i < values.length; i++) {
            var item = values[i];
            if (!otherSet.has(item)) {
                return false;
            }
        }
        return true;
    }
}

// //测试Set类
// var set = new Set();
// //添加元素
// alert(set.add('abc'));
// alert(set.add('cba'));
// alert(set.add('abc'));
// //查看元素
// alert(set.values());
// //删除元素
// alert(set.remove('abc'));
// alert(set.remove('abc'));
// alert(set.values());
// //has方法
// alert(set.has('cba'));
// //获取元素的个数
// alert(set.size());
// set.clear();
// alert(set.size());

//集合间操作测试
//创建两个集合,并添加元素
var setA = new Set();
setA.add('abc');
setA.add('cba');
setA.add('nba');
var setB = new Set();
setB.add('aaa');
setB.add('nba');
setB.add('cba');
//求两个集合的并集
// var unionSet = setA.union(setB);
// alert(unionSet.values());

// //求两个集合的交集
// var intersectionSet = setA.intersection(setB);
// alert(intersectionSet.values());

//求差集
// var differenceSet = setA.difference(setB);
// alert(differenceSet.values());
//判断子集
alert(setA.subset(setB));

以上是关于数据结构与算法--集合(Set)--JS的主要内容,如果未能解决你的问题,请参考以下文章

代码片段 - Golang 实现集合操作

js数据结构与算法——集合

STL源代码剖析——STL算法之set集合算法

学习JavaScript数据结构与算法 第七章

JS实现集合

拿捏javascript数据结构与算法(中)