【ES】笔记-集合介绍与API

集合是一种不允许值重复的顺序数据结构。
通过集合我们可以进行并集、交集、差集等数学运算, 还会更深入的理解如何使用 ECMAScript 2015(ES2015)原生的 Set 类。

构建数据集合

集合是由一组无序且唯一(即不能重复)的项组成的。该数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中。

在数学中的概念

集合,简称集,是数学中一个基本概念,也是集合论的主要研究对象。

集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成集合的这些对象则称为该集合的元素;

基数

集合中元素的数目称为集合的基数,集合A的基数记作card(A)。当其为有限大时,集合A称为有限集,反之则为无限集 [4] 。一般的,把含有有限个元素的集合叫做有限集,含无限个元素的集合叫做无限集 [4] 。

表示

假设有实数x < y:

①[x,y] :方括号表示包括边界,即表示x到y之间的数以及x和y;

②(x,y):小括号是不包括边界,即表示大于x、小于y的数 [4] 。

特性

  • 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现 [6] 。

  • 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次 [6] 。

  • 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序 [6] 。

创建集合类

class Set{
  constructor(){
    this.items = {}  
  }
}

实现常用的方法:(尝试模拟与 ECMAScript 2015 实现相同的 Set 类)

 add(element):向集合添加一个新元素。
 delete(element):从集合移除一个元素。
 has(element):如果元素在集合中,返回 true,否则返回 false。  clear():移除集合中的所有元素。
 size():返回集合所包含元素的数量。它与数组的 length 属性类似。  values():返回一个包含集合中所有值(元素)的数组。

实现has(element)

//第一种方式
has(element){ 
  return element in items;
};
//第二种
has(element) {
  return Object.prototype.hasOwnProperty.call(this.items, element);
}

说明:也可以在代码中使用 this.items.hasOwnProperty(element)。但是, 如果这样的话,代码检查工具如 ESLint 会抛出一个错误。错误的原因为不是所 有的对象都继承了 Object.prototype,甚至继承了 Object.prototype 的对 象上的 hasOwnProperty 方法也有可能被覆盖,导致代码不能正常工作。要避 免出现任何问题,使用 Object.prototype.hasOwnProperty.call 是更安全的做法。

add方法

   add(element) {
      if (!this.has(element)) {
        this.items[element] = element; // {1}
        return true;
      }
      return false;
    }

说明:添加一个 element 的时候,把它同时作为键和值保存,因为这样有利于查找该 元素。

其他方法这里不再一一实现。

集合的运算

集合是数学中基础的概念,在计算机领域也非常重要。它在计算机科学中的主要应用之一是 数据库,而数据库是大多数应用程序的根基。集合被用于查询的设计和处理。当我们创建一条从 关系型数据库(Oracle、Microsoft SQL Server、MySQL 等)中获取一个数据集合的查询语句时, 使用的就是集合运算,并且数据库也会返回一个数据集合。当我们创建一条 SQL 查询命令时, 可以指定是从表中获取全部数据还是获取其中的子集;也可以获取两张表共有的数据、只存在于 9 一张表中的数据(不存在于另一张表中),或是存在于两张表内的数据(通过其他运算)。这些

SQL 领域的运算叫作联接,而 SQL 联接的基础就是集合运算。

计算包括:这里不再逐一实现,只详细介绍子集:

并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。
差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
子集:验证一个给定集合是否是另一集合的子集。

isSubsetOf(otherSet) {
  if (this.size() > otherSet.size()) { // {1}
    return false;
  }
  let isSubset = true; // {2}
  this.values().every(value => { // {3}
    if (!otherSet.has(value)) { // {4}
      isSubset = false; // {5}
      return false;
  }
    return true; // {6}
  });
  return isSubset; // {7}
}

说明:在 isSubsetOf 方法中,我们不会像在并集、交集和差集中一样使用 forEach 方法。我们 会用 every 方法代替,它也是 ES2015 中的数组方法,只要回调函数返回 true,every 方法就会被调用(行{6})。如果 回调函数返回 false,循环会停止,这就是为什么我们要在行{5}改变 isSubset 标识的值。

ECMAScript 2015——Set 类

和上面实现的 Set 不同,ES2015 的 Set 的 values 方法返回 Iterator,而不 是值构成的数组。另一个区别是,我们实现的 size 方法返回 set 中存储的值的个数,而 ES2015 的 Set 则有一个 size 属性。

ES6 提供了新的数据接结构Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用【扩展运算符】和【for…of】进行遍历,集合的属性和方法:

  1. size 返回集合的元素个数
    2)add 增加一个新元素,返回当前集合
  2. delete 删除元素,返回boolean值
  3. has 检测集合中是否包含某个元素,返回boolean值
    5)clear 清空集合,返回undefined
  • size
        //声明一个set
        let s=new Set();
        let s2=new Set(['大事儿','小事儿','好事儿','坏事儿','小事儿']);//接收可迭代数据

        //元素个数
        console.log(s2.size);//输出4
  • add
        s2.add('喜事儿');
        console.log(s2);

在这里插入图片描述

  • delete
  //删除元素
  s2.delete('坏事儿');

在这里插入图片描述

  • has
 console.log(s2.has('糟心事'));// 输出false
  • clear
    s2.clear();
    console.log(s2);

在这里插入图片描述

  • 遍历
        for(let v of v2){
            console.log(v);
        }

在这里插入图片描述

ES2015 Set 类的运算

上面的 Set 类实现了并集、交集、差集、子集等数学运算,然而 ES2015 原生的 Set 并没有 这些功能。只能模拟实现。

这里只实现一个,余下可以感兴趣的可以自己动手实现。

模拟实现交集:

const intersection = (setA, setB) => {
      const intersectionSet = new Set();
      setA.forEach(value => {
        if (setB.has(value)) {
          intersectionSet.add(value);
        } 
      });
      return intersectionSet; 
};
console.log(intersection(setA, setB)); // 输出[2, 3]

关于扩展运算符…

有一种计算并集、交集和差集的简便方法,就是使用扩展运算符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/96366.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文件修改时间能改吗?怎么改?

文件修改时间能改吗&#xff1f;怎么改&#xff1f;修改时间是每个电脑文件具备的一个属性&#xff0c;它代表了这个电脑文件最后一次的修改时间&#xff0c;是电脑系统自动赋予文件的&#xff0c;相信大家都应该知道。我们右击鼠标某个文件&#xff0c;然后点击弹出菜单里面的…

ELK安装、部署、调试(一)设计规划及准备

一、整体规划如图&#xff1a; 【filebeat】 需要收集日志的服务器&#xff0c;安装filebeat软件&#xff0c;用于收集日志。logstash也可以收集日志&#xff0c;但是占用的系统资源过大&#xff0c;所以使用了filebeat来收集日志。 【kafka】 接收filebeat的日志&#xff…

【Java笔记】分布式id生成-雪花算法

随着业务的增长&#xff0c;有些表可能要占用很大的物理存储空间&#xff0c;为了解决该问题&#xff0c;后期使用数据库分片技术。将一个数据库进行拆分&#xff0c;通过数据库中间件连接。如果数据库中该表选用ID自增策略&#xff0c;则可能产生重复的ID&#xff0c;此时应该…

【硬件设计】硬件学习笔记一--元器件的介绍与选型

硬件学习笔记一--元器件的选型 一、电阻1.1 电阻的分类1.2 电阻的选型 二、电容2.1 陶瓷电容2.2 钽电容2.3 铝电解电容2.4 电容选型 三、电感3.1 定义与介绍3.2 电感的分类3.3 电感的参数 四、磁珠4.1 磁珠的介绍4.2 磁珠的参数 五、二极管5.1 定义5.2 稳压管5.3 肖特基二极管5…

无涯教程-聚类算法 - K-Means

K-均值聚类算法计算质心并进行迭代&#xff0c;直到找到最佳质心为止&#xff0c;它假定群集的数目是已知的&#xff0c;它也称为扁平聚类算法。通过算法从数据中识别出的簇数以K均值中的" K"表示。 在该算法中&#xff0c;将数据点分配给群集&#xff0c;以使数据点…

五、Kafka消费者

目录 5.1 Kafka的消费方式5.2 Kafka 消费者工作流程1、总体流程2、消费者组原理3、消费者组初始化流程4、消费者组详细消费流程 5.3 消费者API1 独立消费者案例&#xff08;订阅主题&#xff09;2 独立消费者案例&#xff08;订阅分区&#xff09;3 消费者组案例 5.4 生产经验—…

Anolis 8.6 下 Redis 7.2.0 集群搭建和配置

Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…

eslint

什么是eslint ESLint 是一个根据方案识别并报告 ECMAScript/JavaScript 代码问题的工具&#xff0c;其目的是使代码风格更加一致并避免错误。 安装eslint npm init eslint/config执行后会有很多选项&#xff0c;按照自己的需求去选择就好&#xff0c;运行成功后会生成 .esli…

linux创建进程

linux创建进程 准备工作 准备工作 在Ubuntu64系统上 1、安装GCC和Make工具 编译器GCC&#xff1a;把C源码转为二进制程序 Make&#xff1a;自动编译多源文件项目 sudo apt-get update #更新存储库 sudo apt-get install build-essential #安装build-essential包 gcc --versio…

前端 js实现 选中数据 动态 添加在表格中

如下图展示&#xff0c;表格上方有属性内容&#xff0c;下拉选中后&#xff0c;根据选中的内容&#xff0c;添加在下方的表格中。 实现方式&#xff0c;&#xff08;要和后端约定&#xff0c;因为这些动态添加的字段都是后端返回的&#xff0c;后端自己会做处理&#xff0c…

〔019〕Stable Diffusion 之 单图中绘制多人分区域写提示词 篇

✨ 目录 &#x1f388; 下载区域绘制插件&#x1f388; 区域绘制使用&#x1f388; 参数讲解和基础使用&#x1f388; Lora 自组&#x1f388; Lora 自组的使用&#x1f388; 分区扩散&#x1f388; 分区域提示 &#x1f388; 下载区域绘制插件 在绘制图片时&#xff0c;经常绘…

【数据结构】带头双向循环链表---C语言版(单链表我们分手吧,不要再找我玩了!!!)

文章目录 &#x1f438;一、前言&#x1f438;二、链表的分类&#x1f344;1. 单向或者双向链表&#x1f344;2. 带头或者不带头链表&#x1f344;3. 循环或者非循环&#x1f344;4. 最常用链表 &#x1f438;三、带头双向循环链表详解&#x1f34e;创建带头双向循环链表⭕接口…

只考一门数据结构,计算机学硕复录比1:1的山东双非学校考情分析

青岛理工大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1420字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 青岛理工…

CI/CD 持续集成 持续交付

CI&#xff08;Continuous integration&#xff09;持续集成 参考&#xff1a;https://www.jianshu.com/p/2132949ff84a 持续集成是指多名开发者在开发不同功能代码的过程当中&#xff0c;可以频繁的将代码行合并到一起并切相互不影响工作。 持续集成的目的&#xff0c;是让…

ATF(TF-A)安全通告 TFV-2 (CVE-2017-7564)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-2 (CVE-2017-7564) 二、 CVE-2017-7564 一、ATF(TF-A)安全通告 TFV-2 (CVE-2017-7564) Title 启用安全自托管侵入式调试接口&#xff0c;可允许非安全世界引发安全世界panic CV…

SpringCloud学习笔记(十二)_Zipkin全链路监控

Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件&#xff0c;使用它我们可以得知每一个请求所经过的节点以及耗时等信息&#xff0c;并且它对代码无任何侵入&#xff0c;我们先来看一下Zipkin给我们提供的UI界面都是提供了哪些信息。 如何使用Zipkin 虽然在SpringBoot…

C语言练习题解析:挑战与突破,开启编程新篇章!(2)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

phpstorm动态调试

首先在phpstudy搭建好网站&#xff0c;在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…

【大数据】Doris:基于 MPP 架构的高性能实时分析型数据库

Doris&#xff1a;基于 MPP 架构的高性能实时分析型数据库 1.Doris 介绍 Apache Doris 是一个基于 MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff…

IP协议分片重组问题

分片是什么&&为什么会有分片 IP数据报分片的主要目的是为了防止IP数据报文长度超过下一跳链路MTU(最大传输单元)。 数据链路层之MTU 数据链路层中有一个东西叫做MTU&#xff08;最大传输单元&#xff09;&#xff0c;它的作用主要是控制上层给的数据报不要太大&#…