数据结构-集合结构

文章介绍了集合的概念,它是由无序且不重复的元素组成的结构。在计算机科学中,特别是JavaScript中,集合可通过ES6的Set类来实现。文中展示了如何封装一个自定义的Set构造函数,包括添加、删除、检查元素存在、清空集合及获取大小和值的方法。并提供了示例代码来演示集合的使用。
摘要由CSDN通过智能技术生成

集合的特点

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

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

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

看成一种特殊的数组

其实集合你可以将它看成一种特殊的数组.

特殊之处在于里面的元素没有顺序, 也不能重复.

没有顺序意味着不能通过下标值进行访问, 不能重复意味着相同的对象在集合中只会存在一份.

集合的实现

我们要像之前学习其他数据结构一样, 来学习一下集合.

最主要的学习方式就是封装一个属于自己的集合类, 并且可以通过该类进行集合相关的操作.

2011年6月份发布的ES5中已经包含了Array类

2015年6月份发布的ES6中包含了Set类, 所以其实我们可以不封装, 直接使用它.

但是这里, 为了明确集合的内部实现机制, 我们这里还是自己来封装一下这个Set类

封装集合

创建集合类

// 封装集合的构造函数
function Set() {
    // 使用一个对象来保存集合的元素
    this.items = {} 
    
    // 集合的操作方法
}

操作的方法

add(value):向集合添加一个新的项。

remove(value):从集合移除一个值。

has(value):如果值在集合中,返回true,否则返回false

clear():移除集合中的所有项。

size():返回集合所包含元素的数量。与数组的length属性类似。

values():返回一个包含集合中所有值的数组。

has(value)方法

// 判断集合中是否有某个元素
Set.prototype.has = function (value) {
    return this.items.hasOwnProperty(value)
}

add方法

// 向集合中添加元素
Set.prototype.add = function (value) {
    // 1.判断集合中是否已经包含了该元素
    if (this.has(value)) return false

    // 2.将元素添加到集合中
    this.items[value] = value
    return true
}

remove方法

// 从集合中删除某个元素
Set.prototype.remove = function (value) {
    // 1.判断集合中是否包含该元素
    if (!this.has(value)) return false

    // 2.包含该元素, 那么将元素删除
    delete this.items[value]
    return true
}

clear方法

// 清空集合中所有的元素
Set.prototype.clear = function () {
    this.items = {}
}

size方法

// 获取集合的大小
Set.prototype.size = function () {
    return Object.keys(this.items).length
    
    /*
    考虑兼容性问题, 使用下面的代码
    var count = 0
    for (var value in this.items) {
        if (this.items.hasOwnProperty(value)) {
            count++
        }
    }
    return count
    */
}

values方法

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

    /*
    考虑兼容性问题, 使用下面的代码
    var keys = []
    for (var value in this.items) {
        keys.push(value)
    }
    return keys
    */
}

集合的使用

我们来简单使用和测试一下封装的集合类

// 测试和使用集合类
var set = new Set()

// 添加元素
set.add(1)
alert(set.values()) // 1
set.add(1)
alert(set.values()) // 1

set.add(100)
set.add(200)
alert(set.values()) // 1,100,200

// 判断是否包含元素
alert(set.has(100)) // true

// 删除元素
set.remove(100)
alert(set.values()) // 1, 200

// 获取集合的大小
alert(set.size()) // 2
set.clear()
alert(set.size()) // 0

完整代码

// 封装集合的构造函数
function Set() {
    // 使用一个对象来保存集合的元素
    this.items = {}

    // 集合的操作方法
    // 判断集合中是否有某个元素
    Set.prototype.has = function (value) {
        return this.items.hasOwnProperty(value)
    }

    // 向集合中添加元素
    Set.prototype.add = function (value) {
        // 1.判断集合中是否已经包含了该元素
        if (this.has(value)) return false

        // 2.将元素添加到集合中
        this.items[value] = value
        return true
    }

    // 从集合中删除某个元素
    Set.prototype.remove = function (value) {
        // 1.判断集合中是否包含该元素
        if (!this.has(value)) return false

        // 2.包含该元素, 那么将元素删除
        delete this.items[value]
        return true
    }

    // 清空集合中所有的元素
    Set.prototype.clear = function () {
        this.items = {}
    }

    // 获取集合的大小
    Set.prototype.size = function () {
        return Object.keys(this.items).length

        /*
        考虑兼容性问题, 使用下面的代码
        var count = 0
        for (var value in this.items) {
            if (this.items.hasOwnProperty(value)) {
                count++
            }
        }
        return count
        */
    }

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

        /*
        考虑兼容性问题, 使用下面的代码
        var keys = []
        for (var value in this.items) {
            keys.push(value)
        }
        return keys
        */
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值