前端仔之理解数据结构五 集合

前言

几乎所有编程语言,都有集合结构;

集合比较常见的实现方式就是 哈希表;

可以把集合看成是特殊的数组;

特殊之处在于没有顺序 也不能重复,没有顺序意味着不能通过小标值进行访问 不能重复意味着相同的对象结合中只会存在一份;

集合类 ES6 有Set类(集合类)

集合的特点

集合通常是由一组无序的 不能重复的元素构成;

和数学中的集合名词比较相似 但是数学中的集合范围更大一些 也允许集合中的元素重复;

在计算机中 集合通常表示的结构中元素是不允许重复的;

集合的常见操作

1.add 向集合里面添加元素。

2.remove 从集合里面移除一个值。

3.has 如果值在集合中,返回true,否则返回false。

4.clear 移除集合中的所有项。

5.size 返回集合所包含元素的数量,与数组的length属性类似。

6.values 返回一个包含集合中所有值的数组。

集合之间的操作

并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。

交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。

差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。

子集:验证一个给定集合是否是另一集合的子集。

如图所示可以表示结合的绝大多数关系

集合的封装以及常见操作

在此对集合进行封装 但是数组有这可以通过下标查询的特性 那么存储容器就不使用数组了 集合在计算机中的特点通常是一个不连续的空间 且不能使用下标查询(没有顺序) (不能重复)的,所以存储容器选择为对象。

class Set {
    // 属性
    constructor() {
        this.container = {}
    }
    // 方法 
    // 1.向集合里面添加元素
    add(value) {
        // 判断当前集合中是否已经包含了该元素
        if (this.has(value)) {
            return false
        }
        // 将元素添加到集合中
        this.container[value] = value
        return true
    }
    // 2.从集合里面移除一个值
    remove(value) {
        if (!this.has(value)) {
            return false
        }

        delete this.container[value]
        return true
    }
    // 3.如果值在集合中,返回true,否则返回false。
    has(value) {
        return this.container.hasOwnProperty(value)
    }
    // 4.移除集合中的所有项
    clear() {
        this.container = {}
    }
    // 5.返回集合所包含元素的数量。与数组的length属性类似。
    size() {
        return Object.keys(this.container).length

    }
    // 6.返回一个包含集合中所有值的数组。
    values() {
        return Object.keys(this.container)
    }
    // 并集
    union(otherSet) {
        let unionSet = new Set()
        // 取出A集合的元素添加到新集合中
        let values = this.values()
        for (let i = 0; i < values.length; i++) {
            unionSet.add(values[i])
        }

        //  取出B集合的元素,判断是否添加到新集合中
        values = otherSet.values()
        for (let i = 0; i < values.length; i++) {
            unionSet.add(values[i])
        }

        return unionSet
    }
    // 交集
    interSet(otherSet) {
        let unionSet = new Set();

        let values = otherSet.values()
        for (let i = 0; i < values.length; i++) {
            if (this.has(values[i])) {
                unionSet.add(values[i])
            }
        }
    }
    // 差集
    differSet(otherSet) {
        let unionSet = new Set();

        let values = otherSet.values()
        for (let i = 0; i < values.length; i++) {
            if (!this.has(values[i])) {
                unionSet.add(values[i])
            }
        }
    }
    // 求子集合
    subSet(otherSet) {
        
        let values = otherSet.values()
        for (let i = 0; i < values.length; i++) {
            if (!this.has(values[i])) {
                return false
            }
        }

        return true
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值