数据结构之字典入门

前言

字典做为最经常使用的数据结构之一,以键值对的形式存储,最多见的好比像电话簿。字典常常被用来维护某些相对固定的枚举方法或者属性。javascript

字典咱们本文使用的是数组做为其基本的数据结构支持,没有使用对象,固然数组也是对象,而对象也是按照字典的基本思路设计的。没有使用基本对象做为其数据结构是由于咱们某些场景须要对字典进行排序。vue

本文源自《数据结构与算法javascript描述》这本书的字典第七章相关章节。java

使用场景

对象自己做为字典

在写业务代码的时候,我不少时候看到小伙伴写代码的时候写了过多的具备高度频率重复的一些键值对的对应,或者说if,else的判断。在这种状况下,若是其枚举属性和值比较固定,建议其做为一个枚举字典固定存储和全局使用或者按需使用,这样代码会精简不少。好比:es6

// old codes 
let text = '';
if(status === 1){
	text = '没有开课';
} else if(status === 2) {
	text = '上课中'
} else {
	text = '没有这个课程';
}

// better codes in status.js or enum.js
const statusDict = {
	1:'没有开课'2'上课中',
}
const getStatusText = (status) => {
  const defaultText = '没有这个课程';
  if(!status) return defaultText;
	return statusDict[status] || defaultText;
}

// 在vue.js 中有过滤器这样的方法,
//若是你的应用中高频使用一种过滤器,且针对业务较固定,能够考虑定义为全局过滤器,字典结构维护和使用
复制代码

其余待补充

代码实现

基本定义

由于es6中已经支持了class类,因此咱们直接用class语法来实现相关的代码吧,在字典中必有的几个操做,查询,增长,移除,展现。算法

codepen代码地址:连接api

class Dictionary{
  constructor(){
    this.dataStore = new Array();
    this.type = 'Dictionary';
  }
  find(key){
    return this.dataScore[key];
  }
  add(key, value){
    this.dataStore[key] = value ;
  }
  remove(key){
    delete this.dataStore[key];
  }
  showAll(){
    // 这里说明下 for in拿到的是全部对象属性 包括继承来的,而Object.keys仅仅是自身属性
    let keys = Object.keys(this.dataStore);
    for(var key in keys){
      console.log(`${keys[key]}:${this.dataStore[keys[key]]}`);
    }
  }
}

let numbook = new Dictionary();
numbook.add('mike',1314);
numbook.add('david',98732);
numbook.add('kitty',1314);
numbook.remove("mike");
numbook.showAll();
复制代码

备注:咱们在遍历数组内的全部含有值时,须要用for in遍历,不能用普通的for循环,由于对于数组而言,非数字键的不计入其数组元素。而数组自己也是对象,特殊的是其固定的针对数字键的造成指定顺序的显示与返回。数组

另外我想说明的是,虽然对象自己就支持较好的字典性质的api,但咱们为何还要额外去定义本身的数据结构呢?由于咱们不少时候须要的不是基本api,而是基于某些特定场景下对数据的灵活使用和封装。若是咱们对业务代码使用时一个基本的对象字典就够了,固然不用额外定义字典类。可是当某些业务场景下须要咱们对字典这种基本api使用的条件下,再作一些额外的功能,那确定仍是须要额外定义本身的字典的。数据结构

辅助方法

咱们须要实现的辅助方法主要有下面几种。ui

class Dictionary{
 // codes xxx
  // 返回具备的个数 ,为何不用length,由于数组的lenth仅仅针对数字键
  count(){
    let n = 0 ;
    for(let p in Object.keys(this.datastore)){
    	n++;
	   }
    return n;
  }
  // 清除全部元素
  clear(){
    for each (let key in Object.keys(this.dataStore)){
    	delete this.dataStore[key]
    }
  }
  
}
复制代码

按照顺序显示,前面讲到咱们使用数组,主要是由于有排序的需求。那么咱们的场景就假设在展现的时候排序便可。this

class Dictionary{
 // codes xxx
  // 返回具备的个数 ,为何不用length,由于数组的lenth仅仅针对数字键
  showAllSort(){
   let keys = Object.keys(this.dataStore).sort();
    for(var key in keys){
      console.log(`${keys[key]}:${this.dataStore[keys[key]]}`);
    }
  }
  
}
复制代码

练习

使用字典的结构,写一个以下的程序,在一段英文文本内,判断出每一个单词出现的个数并最终显示出来。

class WordCountDict{
  constructor(text){
    this.wordDict = {};
    this.text = text;
    this.init();
  }
  init(){
      let wordArr= this.text.split(' ');
      for(let i=0,len=wordArr.length;i<len;i++){
        if(wordArr[i] in this.wordDict){
          this.wordDict[wordArr[i]]++;
        } else {
          this.wordDict[wordArr[i]] = 1;
        }
      }
      for(let p in this.wordDict){
        console.log(`${p}:${this.wordDict[p]}`)
      }
  }
  
}

let text = 'I am a good student and you are a bad one and so on';
let textDict = new WordCountDict(text);
复制代码
相关文章
相关标签/搜索