JavaScript 数据结构与算法(八)集合

集合

几乎每种编程语言中,都有集合结构。集合比较常见的实现方式是哈希表,这里使用 JavaScript 的 Object 进行封装。

集合特点

  • 集合通常是由一组无序的不能重复的元素构成。

  • 数学中常指的集合中的元素是可以重复的,但是计算机中集合的元素不能重复。

  • 集合是特殊的数组。

    • 特殊之处在于里面的元素没有顺序,也不能重复。
    • 没有顺序意味着不能通过下标值进行访问,不能重复意味着相同的对象在集合中只会存在一份。

封装集合

ES6 中的 Set 就是一个集合类,这里我们重新封装一个 Set 类,了解集合的底层实现。

集合常见的操作

  • add(value) 向集合添加一个新的项。
  • remove(value) 从集合移除一个值。
  • has(value) 如果值在集合中,返回 true,否则返回false
  • clear() 移除集合中的所有项。
  • size() 返回集合所包含元素的数量。与数组的 length 属性类似。
  • values() 返回一个包含集合中所有值的数组。
  • 还有其他的方法,用的不多,这里不做封装。

代码实现

// 集合结构的封装
class Set {constructor() {this.items = {};}// has(value) 判断集合中是否存在 value 值,存在返回 true,否则返回 falsehas(value) {return this.items.hasOwnProperty(value);}// add(value) 往集合中添加 valueadd(value) {if (this.has(value)) return false;this.items[value] = value;return true;}// remove(value) 删除集合中指定的 valueremove(value) {// 如果集合不存在该 value,返回 falseif (!this.has(value)) return false;delete this.items[value];}// clear() 清空集合中所有 valueclear() {this.items = {};}// size() 获取集合中的 value 个数size() {return Object.keys(this.items).length;}// values() 获取集合中所有的 valuevalues() {return Object.keys(this.items);}
}

代码测试

const set = new Set();// add() 测试
set.add("abc");
set.add("abc");
set.add("123");
set.add("zxc");
console.log(set); //--> {items: {123: "123", abc: "abc", zxc: "zxc"}}// has() 测试
console.log(set.has("123")); //--> true
console.log(set.has("456")); //--> false// remove() 测试
set.remove("abc");
console.log(set); //--> {items: {123: "123", zxc: "zxc"}}// size() 测试
console.log(set.size()); //--> 2// values() 测试
console.log(set.values()); //--> ["123", "zxc"]// clear() 测试
set.clear();
console.log(set.values()); //--> []

集合间的操作

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

并集的实现

// union() 求两个集合的并集
union(otherSet) {// 1、创建一个新集合let unionSet = new Set();// 2、将当前集合(this)的所有 value,添加到新集合(unionSet)中for (let value of this.values()) {unionSet.add(value);}// 3、将 otherSet 集合的所有 value,添加到新集合(unionSet)中for (let value of otherSet.values()) {unionSet.add(value); // add() 已经有重复判断}return unionSet;
}

交集的实现

// intersection() 求两个集合的交集
intersection(otherSet) {// 1、创建一个新集合let intersectionSet = new Set();// 2、从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在for (let value of this.values()) {if (otherSet.has(value)) {intersectionSet.add(value);}}return intersectionSet;
}

差集的实现

// difference() 差集
difference(otherSet) {// 1、创建一个新集合let differenceSet = new Set();// 2、从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在,不存在的即为差集for (let value of this.values()) {if (!otherSet.has(value)) {differenceSet.add(value);}}return differenceSet;
}

子集的实现

// subset() 子集
subset(otherSet) {// 从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在,有不存在的返回 false// 遍历完所有的,返回 truefor (let value of this.values()) {if (!otherSet.has(value)) {return false;}}return true;
}

集合的完整实现

// 集合结构的封装
export default class Set {constructor() {this.items = {};}// has(value) 判断集合中是否存在 value 值,存在返回 true,否则返回 falsehas(value) {return this.items.hasOwnProperty(value);}// add(value) 往集合中添加 valueadd(value) {if (this.has(value)) return false;this.items[value] = value;return true;}// remove(value) 删除集合中指定的 valueremove(value) {// 如果集合不存在该 value,返回 falseif (!this.has(value)) return false;delete this.items[value];}// clear() 清空集合中所有 valueclear() {this.items = {};}// size() 获取集合中的 value 个数size() {return Object.keys(this.items).length;}// values() 获取集合中所有的 valuevalues() {return Object.keys(this.items);}// ------- 集合间的操作 ------- //// union() 求两个集合的并集union(otherSet) {// 1、创建一个新集合let unionSet = new Set();// 2、将当前集合(this)的所有 value,添加到新集合(unionSet)中for (let value of this.values()) {unionSet.add(value);}// 3、将 otherSet 集合的所有 value,添加到新集合(unionSet)中for (let value of otherSet.values()) {unionSet.add(value); // add() 已经有重复判断}return unionSet;}// intersection() 求两个集合的交集intersection(otherSet) {// 1、创建一个新集合let intersectionSet = new Set();// 2、从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在for (let value of this.values()) {if (otherSet.has(value)) {intersectionSet.add(value);}}return intersectionSet;}// difference() 差集difference(otherSet) {// 1、创建一个新集合let differenceSet = new Set();// 2、从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在,不存在的即为差集for (let value of this.values()) {if (!otherSet.has(value)) {differenceSet.add(value);}}return differenceSet;}// subset() 子集subset(otherSet) {// 从当前集合中取出每一个 value,判断是否在 otherSet 集合中存在,有不存在的返回 false// 遍历完所有的,返回 truefor (let value of this.values()) {if (!otherSet.has(value)) {return false;}}return true;}
}

08_JavaScript数据结构与算法(八)集合相关推荐

  1. 数据结构与算法-- 八皇后问题(多种实现方案)

    八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想,想到了一个经典的算法题,八皇后问题: 题目:在8*8的国际象棋上摆放8个皇后,使得其互相不能攻击,即任意两个换后不能在同一行,同一列,或者同 ...

  2. js计算字典的个数_JS数据结构与算法_集合字典

    写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 一.集合Set 1.1 集合数据结构 集合set是一种包含不同元素的数据结构.集合中的元素成为成员.集合的两个最重要特性是:集合中 ...

  3. Java数据结构与算法(八)-二叉树

    一.为什么要使用树 有序数组插入.删除数据慢. 链表查找数据慢 树可以解决这两个问题 二.相关术语 树的结点:包含一个数据元素及若干指向子树的分支: 孩子结点:结点的子树的根称为该结点的孩子: 双亲结 ...

  4. JS数据结构与算法_链表

    上一篇:JS数据结构与算法_栈&队列 下一篇:JS数据结构与算法_集合&字典 写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 上一篇博客发布以后,仅几天的时间竟然 ...

  5. 数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)

    时间效率 互联网想对时间效率格外的敏感,所以我们总是在需求迭代一定程度后去做优化.而且我们解决问题的时候,时间效率往往是一个考查的重点.因此我们平时编码过程中就必须不断的优化效率,追求完美的态度与能力 ...

  6. 数据结构与算法--字符串的排列组合问题

    字符串的全排列 题目:输入一个字符串,打印出改字符串中所有字符的所有排列.例如输入字符串abc,那么打印出由a,b,c字符组成的所有字符串:abc,acb,bac,bca,cab,cba 如何求解全排 ...

  7. Android版数据结构与算法汇总十二章

    Android版数据结构与算法(一):基础简介 https://www.cnblogs.com/leipDao/p/9140726.html Android版数据结构与算法(二):基于数组的实现Arr ...

  8. java基础----数据结构与算法----Java API:集合 以及 排序相关API

    概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map   ...

  9. 四大金刚 数据结构_学习JavaScript数据结构与算法(三):集合

    集合(Set遇新是直朋能到) 说起集合,就想起刚进高中时,数学第一课讲的就是集合.因此在学习集合这种数据结构时,倍感亲切. 集合的基本性质有一条: 集合中元素是不重复的.因为这种性质,所以我们选用了对 ...

最新文章

  1. centos 6 上安装l7 filter尝试过滤xunlei
  2. 新手学习编程的最佳方式是什么?
  3. ios怎样在一个UIImageButton的里面加一些自己定义的箭头
  4. CMOS图像传感器——TDI CIS
  5. 删除.svn文件夹方法(转)
  6. python 模块 包 库_模块(包、库)
  7. Hibernate框架 简述
  8. java编译生成哪些文件_java编译后生成什么文件?生成的文件包括什么?
  9. JavaScript Ajax与Comet——“其他跨域技术”的注意要点
  10. 微型计算机的输入 输出设备PPT,(微型计算机系统模型).ppt
  11. js原生语法实现表格操作
  12. 【Matlab图像隐写】DCT数字水印嵌入与提取【含GUI源码 943期】
  13. 第二次数学建模训练题
  14. CF 128A Statues
  15. OpenSSL自建CA和颁发SSL证书
  16. 数据结构名词解释详细总结
  17. 斩断***黑手:如何使用IceSword冰刃
  18. 【踩坑记录】导航时出现原地旋转,然后无法执行导航
  19. MathType如何编辑等号带点
  20. 征信篇: 如何保护个人隐私,防止征信受损?

热门文章

  1. 常见算法思想1:枚举法
  2. AUTOCAD使用心得
  3. 嵌入式是做什么的可就业方向是怎样的?
  4. 喵帕斯之矩阵 SDUT
  5. Opencv——银行卡识别系统
  6. Chatgpt的三个镜像网站(无需”魔法“直接用)
  7. python树结构字典_Python 数据结构——解析树及树的遍历
  8. NLP_BERT模型的介绍
  9. 苹果手机拷贝功能 php,苹果iPhone上的“通用剪贴板”到底是什么?
  10. jQuery——JavaScript 库