数据结构(JS实现)——了解Set集合机制

集合结构一般的实现方式为哈希表。

本篇文章的目的时为了明确集合的内部实现机制,因此自己用Object封装一个简单的Set类

一.set 集合的特点

  1. 集合通常时无序的,不能重复的元素构成
  2. 一种特殊的数组
  3. 不能通过下标值来进行访问
  4. 相同的对象只能在集合中存在一份

一.set 集合的封装

function Set() {
        // 保存集合的元素
        this.items={};
        // 操作
    }

三. 常见的操作

集合自身操作:

1.add(value):添加元素

2.remove(value):移除某个元素

3.has(value):判断value是否在集合中

4.clear():清空

5.size():长度

6.values():返回包含所有元素的数组

集合间的操作:

7.并集

8.交集

9.差集: 设A,B是两个集合,由所有属于A且不属于B的元素组成的集合

10.子集

3.1.add(value):添加元素

判断是否为空,通过object直接添加

 Set.prototype.add = function (value) {
            // 判断
            if (this.has(value)) {
                return false;
            }
            this.items[value] = value;
            return true
        }

3.2.remove(value):移除某个元素

判断集合中是否存在此元素

若没有直接delete删除

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

3.3.has(value):判断value是否在集合中

通过hasOwnProperty()对象方法判断

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

3.4.clear():清空

 Set.prototype.clear = function (value) {
            this.items = {}
            return true;
        }

3.5.size():长度

  Set.prototype.size = function (value) {
            return Object.keys(this.items).length;
        }

3.6.values():返回包含所有元素的数组

  Set.prototype.values = function () {
            return Object.keys(this.items);
        }

3.7.union(): 并集

  Set.prototype.union = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                newSet.add(values[i]);
            }
            var otherSetvalues = otherSet.values();
            //将other集合放入newset中
            for (var i = 0; i < otherSetvalues.length; i++) {
                newSet.add(otherSetvalues[i]);
            }
            return newSet;
        }

3.8.intersection():交集

   Set.prototype.intersection = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (otherSet.items.hasOwnProperty(values[i])) {
                    newSet.add(values[i]);
                }
            }
            return newSet;
        }

3.9.difference():差集 : 由所有属于A且不属于B的元素组成的集合

    Set.prototype.difference = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.items.hasOwnProperty(values[i])) {
                    newSet.add(values[i]);
                }
            }
            return newSet;
        }

3.10.child():子集

 Set.prototype.child = function (otherSet) {
            if (this.size()>otherSet.size()) {
                return false;
            }
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.items.hasOwnProperty(values[i])) {
                    return false;
                }
            }
            return true;
        }

四.源码

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    function Set() {
        // 保存集合的元素
        this.items = {};

        // 操作

        // 1.add(value): 添加元素
        Set.prototype.add = function (value) {
            // 判断
            if (this.has(value)) {
                return false;
            }
            this.items[value] = value;
            return true
        }

        // 2.remove(value): 移除某个元素
        Set.prototype.remove = function (value) {
            if (this.has(value)) {
                delete this.items[value]
                return true
            }
            return false;
        }
        // 3.has(value): 判断value是否在集合中
        Set.prototype.has = function (value) {
            return this.items.hasOwnProperty(value);
        }

        // 4.clear(): 清空
        Set.prototype.clear = function (value) {
            this.items = {}
            return true;
        }

        // 5.size(): 长度
        Set.prototype.size = function (value) {
            return Object.keys(this.items).length;
        }
        // 6.values(): 返回包含所有元素的数组
        Set.prototype.values = function () {
            return Object.keys(this.items);
        }

        // 7.并集
        Set.prototype.union = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                newSet.add(values[i]);
            }
            var otherSetvalues = otherSet.values();
            //将other集合放入newset中
            for (var i = 0; i < otherSetvalues.length; i++) {
                newSet.add(otherSetvalues[i]);
            }
            return newSet;
        }

        // 8.交集

        // 7.并集
        Set.prototype.intersection = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (otherSet.items.hasOwnProperty(values[i])) {
                    newSet.add(values[i]);
                }
            }
            return newSet;
        }

        // 9.差集

        Set.prototype.difference = function (otherSet) {
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.items.hasOwnProperty(values[i])) {
                    newSet.add(values[i]);
                }
            }
            return newSet;
        }
        // 10.子集
        Set.prototype.child = function (otherSet) {
            if (this.size()>otherSet.size()) {
                return false;
            }
            var newSet = new Set();
            var values = this.values();
            // 将this集合放入newset中
            for (var i = 0; i < values.length; i++) {
                if (!otherSet.items.hasOwnProperty(values[i])) {
                    return false;
                }
            }
            return true;
        }
    }
</script>

</html>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值