【数据结构与算法】详解什么是集合,并用代码手动实现一个集合结构

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 删除元素

Set.prototype.delete = function(value) {

// 判断集合中是否存在该元素

if(!this.has(value)) return false;

// 删除指定元素

delete this.items[value]

// 返回 true,表示删除成功

return true

}

}

我们来使用一下该方法

let set = new Set()

// 添加三个元素,分别为 3 1 6

set.add(3)

set.add(1)

set.add(6)

// 删除元素 6

set.delete(6)

console.log(set.items)

/* 打印结果:

{

‘1’: 1,

‘3’: 3

}

*/

我们可以看到,6 成功被删除了

(5)实现clear()方法


clear() 方法时用于清空集合中的所有元素的。该方法无需传入参数

实现思路: 直接将 this.items 指向一个空的对象即可

我们看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 清空集合

Set.prototype.clear = function() {

this.items = {}

}

}

来使用一下该方法

let set = new Set()

// 添加三个元素,分别为 3 1 6

set.add(3)

set.add(1)

set.add(6)

// 清空集合

set.clear()

console.log(set.items)

/* 打印结果:

{}

*/

我们可以看到,集合中的所有元素已经被清空了

(6)实现size()方法


size() 方法就是返回集合中的元素个数。该方法无需传入参数

这里先介绍一个JS中对象的内置方法:

keys()方法可以接收一个对象参数,并返回该对象所有的键,存放在一个数组中并返回

实现思路: 通过 keys() 获取包含集合所有键的数组,并返回该数组的 length 即可

我们来看一下代码吧

function Set() {

// 属性

this.items = {}

// 方法

// 判断集合内元素个数

Set.prototype.size = function() {

return Object.keys(this.items).length

}

}

来使用一下该方法

let set = new Set()

console.log(set.size()) // 0,此时集合为空

// 添加三个元素,分别为 3 1 6

set.add(3)

set.add(1)

set.add(6)

console.log(set.size()) // 3,此时集合内有三个元素

(7)实现values()方法


values() 方法是用于返回集合中的所有元素。该方法无需传入任何参数

实现思路: 直接将通过方法 keys() 获取到的数组返回即可

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 返回集合内所有元素

Set.prototype.values = function() {

return Object.keys(this.items)

}

}

我们来使用一下该方法

let set = new Set()

console.log(set.values()) // [],此时集合为空

// 添加三个元素,分别为 3 1 6

set.add(3)

set.add(1)

set.add(6)

console.log(set.values()) // [‘1’, ‘3’, ‘6’],此时集合内有三个元素,分别为 1 、3 、6

(8)实现union()方法


union() 方法用于获取当前集合与另一个集合的并集。该方法需要传入一个集合 otherSet 作为参数

实现思路:

  1. 先创建一个空的新集合 newSet

  2. 通过 values() 方法获取到包含当前集合的所有元素的数组 oldSetValue,并对其进行遍历,将遍历到每一个元素都添加到 newSet() 中去

  3. 再通过 values() 方法获取到包含 otherSet 的所有元素的数组 otherSetValue,并对其进行遍历,将遍历到每一个元素都添加到 newSet() 中去

  4. 返回 newSet

在该实现过程中,我们是通过 add() 方法将两个集合中的所有元素添加到新的集合中的,因为 add() 方法中已经包含了检验元素的重复性部分,所以我们无需担心两个集合的元素是否会重复

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 获取交集

Set.prototype.union = function(otherSet) {

// 1. 创建新的空集合

let newSet = new Set()

// 2. 获取当前集合的所有元素

let oldSetValue = this.values()

// 2.1 遍历当前集合的元素,并添加到 newSet中

for(let i = 0; i < oldSetValue.length; i++) {

newSet.add(oldSetValue[i])

}

// 3. 获取 otherSet集合的所有元素

let otherSetValue = otherSet.values()

// 3.1 遍历 otherSet集合的元素,并添加到 newSet中

for(let j = 0; j < otherSetValue.length; j++) {

newSet.add(otherSetValue[j])

}

// 4. 返回获取到的交集

return newSet

}

}

我们来使用一下该方法

// 创建集合1

let set1 = new Set()

// 向集合1中添加元素 3 1 6

set1.add(3)

set1.add(1)

set1.add(6)

// 创建集合2

let set2 = new Set()

// 向集合2中添加元素 3 2 8

set2.add(3)

set2.add(2)

set2.add(8)

// 获取集合1和集合2的并集,即集合3

let set3 = set1.union(set2)

// 查看集合3内的所有元素

console.log(set3.values())

/* 打印结果:

[ ‘1’, ‘2’, ‘3’, ‘6’, ‘8’ ]

*/

(9)实现intersect()方法


intersect() 方法是用于获取当前集合与另一个集合的交集。该放需要传入一个集合 otherSet 作为参数

实现思路:

  1. 先创建一个空的新集合 newSet

  2. 通过 values() 方法获取到包含当前集合的所有元素的数组 oldSetValue,并对其进行遍历,判断每一个元素是否也存在于 otherSet 中,若不存在,则不做任何处理

  3. 若存在,则将该元素添加到 newSet 中去

  4. 返回 newSet

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 获取并集

Set.prototype.intersect = function(otherSet) {

// 1. 创建空的新集合

let newSet = new Set()

// 2. 获取当前集合的所有元素

let oldSetValue = this.values()

// 3. 遍历当前集合的所有元素

for(let i = 0; i < oldSetValue.length; i++) {

let item = oldSetValue[i]

// 3.1 元素同时存在于 otherSet中

if(otherSet.has(item)) {

newSet.add(item)

}

}

// 4. 返回获取到的交集

return newSet

}

}

我们来使用一下该方法

// 创建集合1

let set1 = new Set()

// 向集合1中添加元素 3 1 6

set1.add(3)

set1.add(1)

set1.add(6)

// 创建集合2

let set2 = new Set()

// 向集合2中添加元素 3 2 8

set2.add(3)

set2.add(2)

set2.add(8)

// 获取集合1和集合2的交集,即集合3

let set3 = set1.intersect(set2)

// 查看集合3内的所有元素

console.log(set3.values())

/* 打印结果:

[ ‘3’ ]

*/

(10)实现difference()方法


difference() 方法是用于获取当前集合与另一个集合的差集。该放需要传入一个集合 otherSet 作为参数

实现思路:

  1. 先创建一个空的新集合 newSet

  2. 通过 values() 方法获取到包含当前集合的所有元素的数组 oldSetValue,并对其进行遍历,判断每一个元素是否也存在于 otherSet 中,若存在,则不做任何处理

  3. 若不存在,则将该元素添加到 newSet 中去

  4. 返回 newSet

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 获取差集

Set.prototype.difference = function(otherSet) {

// 1. 创建空的新集合

let newSet = new Set()

// 2. 获取当前集合的所有元素

let oldSetValue = this.values()

// 3. 遍历当前集合的所有元素

for(let i = 0; i < oldSetValue.length; i++) {

let item = oldSetValue[i]

// 3.1 otherSset中没有该元素

if(!otherSet.has(item)) {

newSet.add(item)

}

}

// 4. 返回获取到的差集

return newSet

}

}

我们来使用一下该方法

// 创建集合1

let set1 = new Set()

// 向集合1中添加元素 3 1 6

set1.add(3)

set1.add(1)

set1.add(6)

// 创建集合2

let set2 = new Set()

// 向集合2中添加元素 3 2 8

set2.add(3)

set2.add(2)

set2.add(8)

// 获取集合1和集合2的差集,即集合3

let set3 = set1.difference(set2)

// 查看集合3内的所有元素

console.log(set3.values())

/* 打印结果:

[ ‘1’, ‘6’ ]

*/

(11)实现subset()方法


subset() 方法用于判断当前集合是否为另一个集合的子集。该方法需要传入一个集合 otherSet 作为参数

实现思路:

  1. 先创建一个空的新集合 newSet

  2. 通过 values() 方法获取到包含当前集合的所有元素的数组 oldSetValue,并对其进行遍历,判断每一个元素是否也存在于 otherSet 中,若不存在,则直接返回 false,表示当前集合不是 otherSet 的子集

  3. 若所有元素遍历完后,该方法仍为返回任何值,此时直接返回 true,表示当前集合为 otherSet 的子集

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 判断是否为另一个集合的子集

Set.prototype.subset = function(otherSet) {

最后

前15.PNG

前16.PNG

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容

和集合2的差集,即集合3

let set3 = set1.difference(set2)

// 查看集合3内的所有元素

console.log(set3.values())

/* 打印结果:

[ ‘1’, ‘6’ ]

*/

(11)实现subset()方法


subset() 方法用于判断当前集合是否为另一个集合的子集。该方法需要传入一个集合 otherSet 作为参数

实现思路:

  1. 先创建一个空的新集合 newSet

  2. 通过 values() 方法获取到包含当前集合的所有元素的数组 oldSetValue,并对其进行遍历,判断每一个元素是否也存在于 otherSet 中,若不存在,则直接返回 false,表示当前集合不是 otherSet 的子集

  3. 若所有元素遍历完后,该方法仍为返回任何值,此时直接返回 true,表示当前集合为 otherSet 的子集

我们来看一下代码

function Set() {

// 属性

this.items = {}

// 方法

// 判断是否为另一个集合的子集

Set.prototype.subset = function(otherSet) {

最后

[外链图片转存中…(img-s7cQXAHX-1720113446498)]

[外链图片转存中…(img-alKA0kTC-1720113446499)]

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值