这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。
我个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。
第二十二天:开始学习集合
-
set
实现设置的方法,需要传入键和值
set(key,value) { if(!this.has(key)){ this.table[this.toStrFn(key)] = new ValuePair(key, value) this.count++ } return this }如果字典里面没有当前数据,就往table里面去添加数据,最后返回这个实例。我们是以字符串去保存当前的数据的,所以我们还需要保存原来的键和值。
-
ValuePair类
所以我们需要实现保存原来的健和值的类。
class ValuePair { constructor(key, value) { this.key = key; 2 this.value = value; } toString() { return `[#${this.key}: ${this.value}]`; } } -
remove
从字典中移除一个值
remove(key) { if(this.hasKey(key)){ delete this.table[this.toStrFn(key)] this.count-- } return this }如果当前有这个值的话,才对table进行删除。
-
get
从字典中找到一个值
get(key) { if (this.hasKey(key)) { return this.table[this.toStrFn(key)]; } return undefined; }如果有这个key就返回这个这个值,否则的话,直接返回undefined
-
keyValues
keyValues方法是遍历出它的所有键和值
keyValues() { return Object.values(this.table) } keyValues() { let result = [] for(let i in this.table) { if(this.hasKey(i)) { result.push(this.table[i]) } } return result }上面我们用了两种方式实现,第一种是直接使用es6的values方法,第二个种兼容性代码,遍历table,当前键有值就往数组里面添加,最后返回这个数组。我们用了hasKey防范,是因为对象的原型也会包含对象的其他属性。
-
keys
keys方法是遍历出它的所有键
values() { return this.keyValues().map(item => item.value) }在实现了keyValues方法的前提下,可以直接调用该方法,然后用map方法拼出所有的值
-
values
values方法是遍历出它的所有值
keys() { return this.keyValues().map(item => item.key) }同样的,直接调用keyValues方法,map方法拼出所有的键
-
forEach
这个和es5的forEach差不多,但它的第一第二个参数分别是键和值
forEach(callbackFn) { const valuePairs = this.keyValues(); for (let i = 0; i < valuePairs.length; i++) { const result = callbackFn(valuePairs[i].key, valuePairs[i].value); if (result === false) { break; } } }这里做了判断,如果传入的回调返回了false,就打断正在迭代的循环。
-
size
一开始已经做了个count字段记录
size() { return this.count } -
isEmpty
判断该字典是否为空
isEmpty() { return this.size() === 0 } -
clear
clear() { this.table = {}; }清除该字典只需要把table置为空对象即可。
-
toString
toString() { if (this.isEmpty()) { return ''; } const valuePairs = this.keyValues(); let objString = `${valuePairs[0].toString()}`; for (let i = 1; i < valuePairs.length; i++) { objString = `${objString},${valuePairs[i].toString()}`; } return objString; }我们在ValuePair类中已经对key和value做了toString,所以只需要循环该字典,调用实例的toString()方法即可。