数据结构——字典

2018-02-16  本文已影响0人  柏丘君

上篇文章介绍了集合的实现,本文介绍字典。字典和集合十分类似,集合中保存的是一系列值,而字典中保存的是键值对。字典也叫映射,在 ES6 中也有原生的支持:Map
在上篇集合的实现中,MySet 类实际上也可以看作一个字典类,因为在调用 add() 方法添加元素时,会向 dataStore 属性上添加键和值,因此也可以将其看作一个字典。
采用 JavaScript 对象为基础实现集合主要是基于集合的无序性考虑,数组是有序的,因此不适合用来实现集合。使用 JavaScript 对象实现的 MySet 类,需要保存键值,和字典有点相似。不同点在于,实现 MySet 类时,会在内部隐式的计算出一个键,而在实现字典时,需要显式的指定键,这是它们在实现上的一个区别。

字典的代码实现

下面是字典的代码实现,首先定义 IDict 接口:

interface IDict<T>{
    // 添加元素
    add(key:string,val:T):void;
    // 移除元素
    remove(key:string):T;
    // 判断是否存在
    has(key:string):boolean;
    // 根据键获取值
    get(key:string):T;
    // 清空字典
    clear():void;
    // 获取字典的长度
    size():number;
    // 获取所有的键
    keys():string[];
    // 获取所有的值
    values():T[];
}

实现接口,定义 Dict 类:

class Dict<T> implements IDict<T>{
    private dataStore:{
        [propNames:string]:T
    } = {};
    private _size:number = 0;
    add(key:string,val:T):void{
        if(!this.has(key)){
            this.dataStore[key] = val;
            this._size++;
        }
    }
    remove(key:string):T{
        const res:T = this.dataStore[key];
        delete this.dataStore[key];
        this._size--;
        return res;
    }
    has(key:string):boolean{
        return this.dataStore.hasOwnProperty(key);
    }
    get(key:string):T{
        return this.dataStore[key]
    }
    clear():void{
        this.dataStore = {};
    }
    size():number{
        return this._size;
    }
    keys():string[]{
        return Object.keys(this.dataStore);
    }
    values():T[]{
        const tmp:T[] = [];
        Object.keys(this.dataStore).forEach(v => {
            tmp.push(this.dataStore[v])
        })
        return tmp;
    }
}

完。

上一篇下一篇

猜你喜欢

热点阅读