博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用js来实现那些数据结构09(集合01-集合的实现)
阅读量:5155 次
发布时间:2019-06-13

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

  说到集合,第一个想到的就是中学学到的那个数学概念:。在我们开始集合相关的js实现前,我们有必要来了解一下什么是集合以及集合的数学概念。

  好吧,我们一起来复习一下早就被我们遗忘的集合。

  集合是由一组无序且唯一的项组成的。集合这个数据结构使用了与相同的数学概念。在数学中,集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素。

  比如,一个包括0到9十个数字的集合表示为:N = {0,1,2,3,4,5,6,7,8,9}。集合中的对象列表用{}(大括号)包围。还有一个概念叫做空集,也就是该集合中不包含任何元素,也就是{},空集是任何集合的子集。

  除了集合的基本概念,还有一些简单的集合操作,比如并集、交集、差集和子集等。在后面会详细的介绍这些集合的操作。

  那么集合的数据概念就简单介绍完了。我们看看如何去创建一个集合类(set)。

function Set() {    let items = {};}

  嗯,这就是set的骨架,哎??我记得好像ES6中就有这个东东啊?嗯...是的,我们会在后面(下一篇)简单介绍下ES6原生的set类。

  这里我们使用对象而不是数组来表示集合。其实用数组也是可以的。那么是不是说,前面学过的栈和队列也都可以用对象来实现?是的,不要怀疑可行性。因为其实我们在改进这两个数据结构的时候用的就是weapMap这种ES6新增的结构。

  那么接下来要说一下set类有哪些可用的方法。

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

  2、delete(value):从集合移除一个值。

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

  4、clear():清空集合中的所有元素。

  5、size():返回集合所包含元素的数量。

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

function Set() {    let items = {};    //判断该set实例中是否存在该value    this.has = function (value) {        //检查它(或其原型链)上是否包含具有指定名称的属性的对象。但是in运算符会查找其原型链上的属性。所以我们用下面的方法更好        //return value in items;        //hasOwnProperty方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。        //所以我们也可以用hasOwnProperty来判断一个对象的自身属性是否存在        return items.hasOwnProperty(value);    }    this.add = function (value) {        //通过我们上面写的has方法来判断这个值是否存在,如果不存在就添加进去,存在就返回false        if(!this.has(value)) {            items[value] = value;            return true;        }        return false;    }    //同样的道理,判断该set中是否有要删除的对象,如果有就删除,没有就返回false    this.remove = function (value) {        if(this.has(value)) {            delete items[value];            return true;        }        return false;    }    //直接充值items为空,就变相的清空了items中的所有属性    this.clear = function() {        items = {};    }    //Object.keys是ES6中为对象新增的原生方法,它会返回一个数组,其中包含对象的所有元素,这样我们就可以获取其元素的个数了。    this.size = function () {        return Object.keys(items).length;    }    //上面我们用ES6新方法来获取items的长度,但是或许有些浏览器的兼容性不是很好。所以我们也可以用循环遍历计数的方式来完成这个功能    this.sizeLegacy = function () {        let count = 0;        for(let key in items) {            if(items.hasOwnProperty(key))            ++count;        }        return count;    }    this.values = function () {        let values = [];        for(let i = 0,keys = Object.keys(items);i < keys.length; i++) {            values.push(items[keys[i]]);        }        return values;    }    this.valuesLegacy = function () {        let values = [];        for(let key in items) {            if(items.hasOwnProperty(key)) {                values.push(items[key])            }        }        return values;    }}var set = new Set();set.add(1);console.log(set.values());//[1]set.add(2);console.log(set.values());//[1, 2]console.log(set.size());//2set.remove(2);console.log(set.values());//[1]

  这样我们就完整的实现了我们自定义的set类,发没发现我的注释越来越少了,越到后面的学习也就越简单了。因为其实很多东西都是类似的,有它共同的point。

  好了,集合的实现我们已经完成了。下一篇文章会介绍一下集合的几种操作方法以及ES6原生set的一些简单用法介绍。

  

  最后,由于本人水平有限,能力与大神仍相差甚远,若有错误或不明之处,还望大家不吝赐教指正。非常感谢!

转载于:https://www.cnblogs.com/zaking/p/8902219.html

你可能感兴趣的文章
js编写时间选择框
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
HDU 6370(并查集)
查看>>
BZOJ 1207(dp)
查看>>
HDU 2076 夹角有多大(题目已修改,注意读题)
查看>>
洛谷P3676 小清新数据结构题(动态点分治)
查看>>
九校联考-DL24凉心模拟Day2T1 锻造(forging)
查看>>
Attributes.Add用途与用法
查看>>
L2-001 紧急救援 (dijkstra+dfs回溯路径)
查看>>
javascript 无限分类
查看>>
spring IOC装配Bean(注解方式)
查看>>
[面试算法题]有序列表删除节点-leetcode学习之旅(4)
查看>>
SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
查看>>
kubernetes_book
查看>>
侧边栏广告和回到顶部
查看>>
https://blog.csdn.net/u012106306/article/details/80760744
查看>>
海上孤独的帆
查看>>
处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“Manag
查看>>