博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构(七)之集合结构
阅读量:4084 次
发布时间:2019-05-25

本文共 3827 字,大约阅读时间需要 12 分钟。

如需转载, 请咨询作者, 并且注明出处.

有任何问题, 可以关注我的微博: , 或者添加我的微信: 372623326

几乎每种编程语言中, 都有集合结构.

集合比较常见的实现方式时哈希表(后续会学习), 我们这里来实现一个封装的集合类.

一. 集合介绍

我们先来简单认识一下集合的特点.

集合的特点

  • 集合通常是由一组无序的, 不能重复的元素构成.
    • 和数学中的集合名词比较相似, 但是数学中的集合范围更大一些, 也允许集合中的元素重复.
    • 在计算机中, 集合通常表示的结构中元素是不允许重复的.
  • 看成一种特殊的数组
    • 其实集合你可以将它看成一种特殊的数组.
    • 特殊之处在于里面的元素没有顺序, 也不能重复.
    • 没有顺序意味着不能通过下标值进行访问, 不能重复意味着相同的对象在集合中只会存在一份.

集合的实现

  • 我们要像之前学习其他数据结构一样, 来学习一下集合.
  • 最主要的学习方式就是封装一个属于自己的集合类, 并且可以通过该类进行集合相关的操作.
    • 2011年6月份发布的ES5中已经包含了Array类
    • 2015年6月份发布的ES6中包含了Set类, 所以其实我们可以不封装, 直接使用它.
    • 但是这里, 为了明确集合的内部实现机制, 我们这里还是自己来封装一下这个Set类.

二. 封装集合

像前面封装其他数据类型一样, 我们也来封装一下集合类(Set类)

创建集合类

  • 我们先来封装一个Set类

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

    • 代码就是封装了一个集合的构造函数.
    • 在集合中, 添加了一个items属性, 用于保存之后添加到集合中的元素. 因为Object的keys本身就是一个集合.
    • 后续我们给集合添加对应的操作方法.

操作的方法

  • 集合有哪些常见的操作方法呢?

    • 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()) // 1set.add(1)alert(set.values()) // 1set.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()) // 2set.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        */    }}

作者:coderwhy
链接:https://www.jianshu.com/p/2b9b5871313d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的文章
每个人都能做的网易云音乐[vue全家桶]
查看>>
JavaScript专题之数组去重
查看>>
Immutable.js 以及在 react+redux 项目中的实践
查看>>
Vue2.0全家桶仿腾讯课堂(移动端)
查看>>
React+Redux系列教程
查看>>
react-native 自定义倒计时按钮
查看>>
19 个 JavaScript 常用的简写技术
查看>>
ES6这些就够了
查看>>
微信小程序:支付系列专辑(开发指南+精品Demo)
查看>>
iOS应用间相互跳转
查看>>
iOS开发之支付宝集成
查看>>
iOS开发 支付之银联支付集成
查看>>
iOS开发支付集成之微信支付
查看>>
React-Native优化之PureComponent
查看>>
React性能优化总结
查看>>
JSONP - 从理论到实践
查看>>
深入浅出JSONP--解决ajax跨域问题
查看>>
jsonp跨域百度
查看>>
我遇到的前端面试题2017
查看>>
redux深入理解之中间件(middleware)
查看>>