用js来实现那些数据结构09(集合01-集合的实现)

说到集合,第一个想到的就是中学学到的那个数学概念:集合。在我们开始集合相关的js实现前,我们有必要来了解一下什么是集合以及集合的数学概念。好吧,我们一起来复习一下早就被我们遗忘的集合。集合是由一组

大家好,又见面了,我是你们的朋友全栈君。

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

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

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

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

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

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

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

  嗯,这就是set的骨架,哎??我记得好像ES6中就有set这个东东啊?嗯…是的,我们会在后面(下一篇)简单介绍下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());//2
set.remove(2);
console.log(set.values());//[1]

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

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

  

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/124424.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 卸载360天擎企业版需要密码吗_360天擎密码是什么

    卸载360天擎企业版需要密码吗_360天擎密码是什么不要用什么网上用的粉碎文件软件粉碎文件,根本粉碎不掉。直接进入电脑安全模式什么都能删什么都卸载。卸载360天擎需要先进入安装目录找到EntClient文件夹,删完以后就不需要密码能直接卸载了。粗暴一点的方法直接把整个安装目录删了(但一般不建议这样做)如何进入安全模式查看下面文章https://baijiahao.baidu.com/s?id=1636641696071912488&wfr=spider&for=pc…

    2022年9月25日
  • 使用Java中间MessageDigest该文本MD5加密(Java中间MD5样品加密算法演示)

    使用Java中间MessageDigest该文本MD5加密(Java中间MD5样品加密算法演示)

    2022年1月9日
  • 小强学Python+OpenCV之-1.3绘图

    小强学Python+OpenCV之-1.3绘图

    2022年3月3日
  • artcam浮雕实例教程_artcam2018入门教程

    artcam浮雕实例教程_artcam2018入门教程记录过去,奋斗现在,展望未来(给未来即将结束的工作的’存档’)ArtCAM入门简单教程二、浮雕前言:这不是个很专业的浮雕设计教程,不过是很简单即可实现的入门教程,而更深入的浮雕学习建议查找更全面的网上教程或CAM浮雕书籍。   常用的矢量雕刻,详见:http://blog.sina.com.cn/s/blog_647ef76d0101jgwn.html开始之

    2022年9月5日
  • 酒店管理系统程序设计[通俗易懂]

    酒店管理系统程序设计[通俗易懂]酒店管理系统程序设计随着计算机技术的飞速发展,信息时代的到来,信息改变了我们这个社会。各类行业在日常经营管理各个方面也在悄悄地走向规范化和网络化。市场经济的发展,消费者消费意识的提高,酒店行业的竞争越来越激烈。为了提高办事效率,增加、保证酒店的销售额,树立酒店的良好形象,运用科学的管理方法非常必要。客房管理的信息化程度体现在将计算机及网络与信息技术应用于经营与管理,以现代化工具代替传统手工作业。无疑,使用网络信息化管理使客房管理更先进、更高效、更科学,信息交流更迅速。我力求开发一个界面友好,功能强大,使

    2022年9月2日
  • latex怎样绘制表格_LaTeX排版

    latex怎样绘制表格_LaTeX排版latex在线生成表格的网站:http://www.tablesgenerator.com/latex_tables这个网站可以通过三种方式来生成latex表格代码:1、自己设置表格;2、直接导入csv表格;3、直接复制表格内容1、自己设置表格点击File,选择newtables,可以设置需要的行列数2、点击importcsvfile,可以直接导入3、 点击…

    2022年8月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号