定义

set是不允许重复元素的集合类型,set体系最常用的是HashSet ,TreeSet, LinkedHashSet。相同的元素是放不进去set的。

HasHSet是使用HashMap实现的,只是将value固定为一个静态对象,使用key保证集合的唯一性,但是不保证顺序性。

LinkedHashMap是继承自HashSet,具有HashSet的优点,内部使用链表维护了插入顺序。

创建集合

let items = {};

我们使用对象而不是数组来表示集合(items)的原因有两个:

  • 第一个是因为在使用数组时,大部分方法的时间复杂度是O(n)。即我们需要迭代整个数组直到找到要找的那个元素,在最坏的情况下需要迭代数组的所有位置。如果数组有更多元素的话,所需的时间会更长。另外,数组是元素的一个有序集合。为了保证元素排列有序,它会占用更多的内存空间。
  • 另一个就是因为Javascript的对象不允许一个键指向两个不同属性,也保证了集合里的元素都是唯一的。

函数说明及注释

//如果值在集合中, 返回true, 否则返回false。this.has = function (value) {// return value in items;return items.hasOwnProperty(value);};//向集合添加一个新的项。this.add = function (value) {if (!this.has(value)) {items[value] = value; //检查该元素是否在集合中,进行添加return true;}return false;};// 从集合移除一个值this.remove = function (value) {if (this.has(value)) {delete items[value]; //存在该元素,进行移除return true;}return false;};//移除集合中的所有项this.clear = function () {items = {}; // 直接制空};//返回集合所包含元素的数量。 与数组的length属性类似。this.size = function () {return Object.keys(items).length; //返回长度};//在所有浏览器中适用的size改进函数this.sizeLegacy = function () {let count = 0;for (let key in items) { //遍历items对象的所有属性if (items.hasOwnProperty(key)) //检查它们是否是对象自身的属性,避免重复计数++count; //递增}return count;};//返回一个包含集合中所有值的数组//Chrome Firefox IE10+this.values = function () {let values = [];for (let i = 0, keys = Object.keys(items); i < keys.length; i++) {values.push(items[keys[i]]);    //使用push方法将值进行传递}return values;      //返回数组};//all  browersthis.valuesLegacy = function () {let values = [];for (let key in items) { //遍历items对象的所有属性if (items.hasOwnProperty(key)) { //添加一个数组values.push(items[key]);    //push进去}}return values;};

代码测试

    let set = new Set();set.add(1);console.log(set.values()); //输出["1"]console.log(set.has(1)); //输出trueconsole.log(set.size()); //输出1set.add(2);console.log(set.values()); //输出["1", "2"]console.log(set.has(2)); //trueconsole.log(set.size()); //2set.remove(1);console.log(set.values()); //输出["2"]set.remove(2);console.log(set.values()); //输出[]

并集操作

  • 对于给定的两个集合,返回一个包含两个集合中所有元素的新集合
//进行并集操作this.union = function (otherSet) {let unionSet = new Set(); // 创建一个并集数组let values = this.values(); //遍历并全部添加到代表并集的集合中for (let i = 0; i < values.length; i++) {unionSet.add(values[i]);}values = otherSet.values(); //遍历并全部添加到代表并集的集合中for (let i = 0; i < values.length; i++) {unionSet.add(values[i]);}return unionSet;}

代码测试

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
console.log(setA.values());
let setB = new Set();
setB.add(3);
setB.add(4);
setB.add(5);
setB.add(6);
console.log(setB.values());let unionAB = setA.union(setB);
console.log(unionAB.values());      //1,2,3,4,5,6

交集操作

  • 对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。
//进行交集操作this.intersection = function (otherSet) {let intersectionSet = new Set(); //创建一个新的Set实例let values = this.values();for (let i = 0; i < values.length; i++) { //遍历当前Set实例所有的值if (otherSet.has(values[i])) { //验证它们是否也存在于otherSet实例intersectionSet.add(values[i]); //添加到创建的intersectionSet变量中}}return intersectionSet;}

代码测试

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
console.log(setA.values());
let setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);
console.log(setB.values());
let intersectionAB = setA.intersection(setB);
console.log(intersectionAB.values());       //2,3

差集操作

  • 对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合
//进行差集操作this.difference = function (otherSet) {let differenceSet = new Set(); //创建差集数组集合let values = this.values();for (let i = 0; i < values.length; i++) { //遍历集合if (!otherSet.has(values[i])) { //如果不存在该值differenceSet.add(values[i]); //添加在差集数组中}}return differenceSet;};

代码测试

let setA = new Set();
setA.add(1);
setA.add(2);
setA.add(3);
let setB = new Set();
setB.add(2);
setB.add(3);
setB.add(4);let differenceAB = setA.difference(setB);
console.log(differenceAB.values());     //1

判断子集

  • 验证一个给定集合是否是另一个集合的子集。
//判断是否是子集this.subset = function (otherSet) {if (this.size() > otherSet.size()) {  //不能保证是子集return false;} else {let values = this.values();for (let i = 0; i < values.length; i++) { //遍历所有元素if (!otherSet.has(values[i])) { //如果所有元素都不存在在该集合中return false; }}return true; //存在子集}};

代码测试

let setA = new Set();       //1,2
setA.add(1);
setA.add(2);
let setB = new Set();       //1,2,3
setB.add(1);
setB.add(2);
setB.add(3);
let setC = new Set();       //2,3,4
setC.add(2);
setC.add(3);
setC.add(4);
console.log(setA.subset(setB));     //true  B是A的子集
console.log(setA.subset(setC));     //false C不是A的子集

查看源代码

数据结构--集合__源代码

Javascript学习数据结构--集合(Set实现)相关推荐

  1. Javascript学习数据结构--字典

    定义 字典(dictionary)是一些元素的结合.每个元素有一个称作key的域,不同元素的key各不相同. 其抽象数据类型描述为: 抽象数据类型Dictionary { 实例: 具有不同关键字的元素 ...

  2. 原来Github上也有这么多的JavaScript学习资源!

    程序员书库(ID:OpenSourceTop) 编译 书单来自:https://risingstars.js.org/2019/en/ 最近,bestofjs发布了2019年度JavaScript年度 ...

  3. 干干!JavaScript学习路线指南,阅读本文即可

    干干!JavaScript学习路线指南,阅读本文即可 自习/学习路线这样的一期我想写很长时间,因为一直想写的全一点硬一点,所以拖到了现在,我相信这一期对于那些还在上学或者已经工作的同学来说是有帮助的, ...

  4. JavaScript学习记录01快速入门、基本语法、严格检查模式

    文章目录 JavaScript学习记录01快速入门.基本语法.严格检查模式 1.1什么是JavaScript 1.2认识JavaScript框架 1.3快速入门 1.4基本语法入门 1.5数据类型简介 ...

  5. Javascript的数据结构与算法(一)

    1数组 1.1方法列表 数组的常用方法如下: concat: 链接两个或者更多数据,并返回结果. every: 对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true. fi ...

  6. JavaScript学习知识点归纳

    JavaScript学习包括几大方面: 1.基础语法 2.JavaScript核心对象 3.DOM操作 4.BOM操作 5.正则表达式 6.AJAX 7.面向对象编程 以下依次为各版块相关内容==&g ...

  7. 前端获取div里面的标签_web前端教程JavaScript学习笔记DOM

    web前端教程JavaScript学习笔记 DOM一DOM(Document Object Model): 文档对象模型 其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容 获取一个元素 ...

  8. 数据结构稀疏矩阵的加法十字链表_学习数据结构和算法的框架思维

    ----------- 通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友.由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜.我这 ...

  9. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

最新文章

  1. Java基础之I/O流
  2. 系统架构师-基础到企业应用架构-系统设计规范与原则[上篇]
  3. 前端iframe 能指定本地网页吗_微前端的技术拆分方式
  4. 小微商户申请php,微信小微商户申请入驻 - osc_r8q2esik的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 第15章习题解答(一)——《x86汇编语言:从实模式到保护模式》读书笔记40
  6. 07.es_thread_pool使用
  7. 12行代码AC-Leecode 598. 范围求和 II——Leecode每日一题系列
  8. AngularJS快速入门指南15:API
  9. 日志 note_深入源码解析日志框架Log4j2(二)
  10. java urlencode php_PHP如何使用urlencode()函数进行url编码?(代码示例)
  11. Mysql 远程连接的问题 2003 - Can't connect to MySQL server on '39.106.187.107' (60 Operation timed out)...
  12. 【Flink】Flink状态的缩放(rescale)与键组(Key Group)设计
  13. 读Zepto源码之代码结构
  14. hypermesh10的安装
  15. LabelSmooth
  16. app前后台交互php_PHP分布式架构RPC介绍以及手写RPC框架
  17. Ubuntu 下截图工具 [转]
  18. 给初学Python的小伙伴一些建议
  19. Matlab实现数字图像处理——滤波
  20. 植物大战僵尸tv版显示无法连接服务器,创维云电视植物大战僵尸tv版总是无法连接服务器...

热门文章

  1. ICCV 2019 | 华科提出对称性约束的校正网络ScRN,显著改进场景文本识别
  2. 讲述一个自学七年Python编程的码农人生
  3. Python中的实用小技巧,可以省下不是事情,喜欢记得收下
  4. python基础:抓取博客网页上的图片并且保存的例子
  5. 【OpenCV】OpenCV函数精讲之 -- 命名空间
  6. 【嵌入式工程师面试高频问题】你知道IIC吗(附程序说明)
  7. 图像学习-HOG特征
  8. python的os模块使用_Python之os模块的常见用法
  9. macos big sur u盘安装_老款macbook机型欺骗补丁强制安装macOS11 Big Sur图文详解
  10. 工行金融级微服务架构的实践