美文网首页
详解编程语言中的集合结构

详解编程语言中的集合结构

作者: 小码哥教育520it | 来源:发表于2018-08-22 18:04 被阅读0次

    集合

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

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

    dee2ad3a3bf74ba99bcc31beb588866e.jpg

    一. 集合介绍

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

    集合的特点

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

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

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

    · 看成一种特殊的数组

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

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

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

    集合的实现

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

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

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

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

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

    二. 封装集合

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

    创建集合类

    ·

    我们先来封装一个Set类

    ·

    ·

    i. // 封装集合的构造函数

    ii. function Set() {

    iii. // 使用一个对象来保存集合的元素

    iv. this.items = {}

    v.

    vi. // 集合的操作方法

    vii. }

    ·

    代码解析:

    ·

    · 代码就是封装了一个集合的构造函数.

    · 在集合中, 添加了一个items属性, 用于保存之后添加到集合中的元素. 因为Object的keys本身就是一个集合.

    · 后续我们给集合添加对应的操作方法.

    操作的方法

    ·

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

    ·

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

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

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

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

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

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

    · 还有一些集合其他相关的操作, 暂时用不太多, 这里暂不封装.

    ·

    我们来一个个实现这些方法, 相对都比较简单.

    ·

    ·

    has(value)方法

    ·

    ·

    i. // 判断集合中是否有某个元素

    ii. Set.prototype.has = function (value) {

    iii. return this.items.hasOwnProperty(value)

    iv. }

    ·

    add方法

    ·

    ·

    i. // 向集合中添加元素

    ii. Set.prototype.add = function (value) {

    iii. // 1.判断集合中是否已经包含了该元素

    iv. if (this.has(value)) return false

    v.

    vi. // 2.将元素添加到集合中

    vii. this.items[value] = value

    viii. return true

    ix. }

    ·

    remove方法

    ·

    ·

    i. // 从集合中删除某个元素

    ii. Set.prototype.remove = function (value) {

    iii. // 1.判断集合中是否包含该元素

    iv. if (!this.has(value)) return false

    v.

    vi. // 2.包含该元素, 那么将元素删除

    vii. delete this.items[value]

    viii. return true

    ix. }

    ·

    clear方法

    ·

    ·

    i. // 清空集合中所有的元素

    ii. Set.prototype.clear = function () {

    iii. this.items = {}

    iv. }

    ·

    size方法

    ·

    ·

    i. // 获取集合的大小

    ii. Set.prototype.size = function () {

    iii. return Object.keys(this.items).length

    iv.

    v. /*

    vi. 考虑兼容性问题, 使用下面的代码

    vii. var count = 0

    viii. for (var value in this.items) {

    ix. if (this.items.hasOwnProperty(value)) {

    x. count++

    xi. }

    xii. }

    xiii. return count

    xiv. */

    xv. }

    ·

    values方法

    ·

    ·

    i. // 获取集合中所有的值

    ii. Set.prototype.values = function () {

    iii. return Object.keys(this.items)

    iv.

    v. /*

    vi. 考虑兼容性问题, 使用下面的代码

    vii. var keys = []

    viii. for (var value in this.items) {

    ix. keys.push(value)

    x. }

    xi. return keys

    xii. */

    xiii. }

    集合的使用

    ·

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

    ·

    ·

    i. // 测试和使用集合类

    ii. var set = new Set()

    iii.

    iv. // 添加元素

    v. set.add(1)

    vi. alert(set.values()) // 1

    vii. set.add(1)

    viii. alert(set.values()) // 1

    ix.

    x. set.add(100)

    xi. set.add(200)

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

    xiii.

    xiv. // 判断是否包含元素

    xv. alert(set.has(100)) // true

    xvi.

    xvii. // 删除元素

    xviii. set.remove(100)

    xix. alert(set.values()) // 1, 200

    xx.

    xxi. // 获取集合的大小

    xxii. alert(set.size()) // 2

    xxiii. set.clear()

    xxiv. alert(set.size()) // 0

    三. 完整代码

    最后, 我们还是给出集合的完整代码

    完整代码

    ·

    ·

    i. // 封装集合的构造函数

    ii. function Set() {

    iii. // 使用一个对象来保存集合的元素

    iv. this.items = {}

    v.

    vi. // 集合的操作方法

    vii. // 判断集合中是否有某个元素

    viii. Set.prototype.has = function (value) {

    ix. return this.items.hasOwnProperty(value)

    x. }

    xi.

    xii. // 向集合中添加元素

    xiii. Set.prototype.add = function (value) {

    xiv. // 1.判断集合中是否已经包含了该元素

    xv. if (this.has(value)) return false

    xvi.

    xvii. // 2.将元素添加到集合中

    xviii. this.items[value] = value

    xix. return true

    xx. }

    xxi.

    xxii. // 从集合中删除某个元素

    xxiii. Set.prototype.remove = function (value) {

    xxiv. // 1.判断集合中是否包含该元素

    xxv. if (!this.has(value)) return false

    xxvi.

    xxvii. // 2.包含该元素, 那么将元素删除

    xxviii. delete this.items[value]

    xxix. return true

    xxx. }

    xxxi.

    xxxii. // 清空集合中所有的元素

    xxxiii. Set.prototype.clear = function () {

    xxxiv. this.items = {}

    xxxv. }

    xxxvi.

    xxxvii. // 获取集合的大小

    xxxviii. Set.prototype.size = function () {

    xxxix. return Object.keys(this.items).length

    xl.

    xli. /*

    xlii. 考虑兼容性问题, 使用下面的代码

    xliii. var count = 0

    xliv. for (var value in this.items) {

    xlv. if (this.items.hasOwnProperty(value)) {

    xlvi. count++

    xlvii. }

    xlviii. }

    xlix. return count

    l. */

    li. }

    lii.

    liii. // 获取集合中所有的值

    liv. Set.prototype.values = function () {

    lv. return Object.keys(this.items)

    lvi.

    lvii. /*

    lviii. 考虑兼容性问题, 使用下面的代码

    lix. var keys = []

    lx. for (var value in this.items) {

    lxi. keys.push(value)

    lxii. }

    lxiii. return keys

    lxiv. */

    lxv. }

    lxvi. }

    相关文章

      网友评论

          本文标题:详解编程语言中的集合结构

          本文链接:https://www.haomeiwen.com/subject/jnwyiftx.html