数据结构与算法--集合(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));
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值