在字典中,存储的是[键,值]对,其中键名是用来查询特定元素的。字典和集合很相似,集合以[值,值]的形式存储元素,字典则是以[键,值]的形式来存储元素。字典也称作映射。
1、创建字典
var items = {};
function Dictionary() {
}
2、方法
①set(key,value):向字典中添加新元素。
该方法接受一个key和一个value作为参数。我们直接将value设为items对象的key属性的
值。它可以用来给字典添加一个新的值,或者用来更新一个已有的值。
this.set = function(key, value) {
items[key] = value; //{1}
};
②delete(key):通过使用键值来从字典中移除键值对应的数据值。
this.delete= function(key) {
if (this.has(key)) {
delete items[key];
return true;
}
return false;
};
③has(key):如果某个键值存在于这个字典中,则返回true,反之则返回false。
this.has = function(key) {
return key in items;
};
④get(key):通过键值查找特定的数值并返回。
this.get = function(key) {
return this.has(key) ? items[key] : undefined;
};
⑤clear():将这个字典中的所有元素全部删除。
this.clear = function(){
items = {};
};
⑥size():返回字典所包含元素的数量。与数组的length属性类似。
this.size = function(){
return Object.keys(items).length; //{4}
};
⑦keys():将字典所包含的所有键名以数组形式返回。
this.keys = function() {
return Object.keys(items);
};
⑧values():将字典所包含的所有数值以数组形式返回。
this.values = function() {
var values = [];
for (var k in items) { //遍历items对象的所有属性值
if (this.has(k)) {
values.push(items[k]);/*为了确定值存在,我们
使用has函数来验证key确实存在,然后将它的值加入values数组*/
}
}
return values;
};
3、调用
//存储 key values
var dictionary = new Dictionary();
dictionary.set('Gandalf', '1');
dictionary.set('John', '2');
dictionary.set('Tyrion', '3');
console.log(dictionary.has('Gandalf'));//true
console.log(dictionary.keys()); //["Gandalf", "John", "Tyrion"]
console.log(dictionary.values()); //[1,2,3]
console.log(dictionary.get('Tyrion'));//3
4、散列表 HashTable/HashMap
散列算法的作用是尽可能快地在数据结构中找到一个值。道如果要在数据结构中获得一个值(使用get方法),需要遍历整个数据结构来找到它。如果使用散列函数,就知道值的具体位置,因此能够快速检索到该值。散列函数的作用是给定一个键值,然后返回值在表中的地址。
创建散列表
var table = [];
function HashTable() {
}
方法
①实现散列函数
var loseloseHashCode = function (key) {
var hash = 0; /*给定一个key参数,我们就能
根据组成key的每个字符的ASCII码值的和得到一个
数字。所以,首先需要一个变量来存储这个总和*/
for (var i = 0; i < key.length; i++) {
//遍历key
hash += key.charCodeAt(i);
/*将从ASCII表中查到的每个字符对应的ASCII值
加到hash变量中(可以使用JavaScript的String类中的
charCodeAt方法*/
}
return hash % 37; /*最后,返回hash值。为了
得到比较小的数值,我们会使用hash值和一个任意数做除法的
余数(mod)*/
};
②put 增加项
this.put = function (key, value) {
var position = loseloseHashCode(key); /*根据给定
的key,我们需要根据所创建的散列函数计算出它在表中的位置*/
console.log(position + ' - ' + key); /*为了便于展
示信息,我们将计算出的位置输出至控制台。由于它不是必
需的,我们也可以将这行代码移除。*/
table[position] = value; /*将value参数添加到用散列
函数计算出的对应的位置上。*/
};
③remove 移除
要从HashTable实例中移除一个元素,只需要求出元素的位置(可以使用散列函数来获取)
并赋值为undefined。
对于HashTable类来说,我们不需要像ArrayList类一样从table数组中将位置也移除。由于元素分布于整个数组范围内,一些位置会没有任何元素占据,并默认为undefined值。我们也不能将位置本身从数组中移除(这会改变其他元素的位置)。
this.remove = function(key) {
table[loseloseHashCode(key)] = undefined;
};
④get 根据键值检索到的特定的值
this.get = function (key) {
return table[loseloseHashCode(key)];
};
⑤调用:
var table = [];
function HashTable() {
var loseloseHashCode = function (key) {
var hash = 0; //{1}
for (var i = 0; i < key.length; i++) { //{2}
hash += key.charCodeAt(i); //{3}
}
return hash % 37; //{4}
};
this.put = function (key, value) {
var position = loseloseHashCode(key); //{5}
console.log(position + ' - ' + key); //{6}
table[position] = value; //{7}
};
this.get = function (key) {
return table[loseloseHashCode(key)];
};
this.remove = function (key) {
table[loseloseHashCode(key)] = undefined;
};
}
var hash = new HashTable();
hash.put('Gandalf', '1'); //19 - Gandalf
hash.put('John', '2'); //29 - John
hash.put('Tyrion', '3'); //16 - Tyrion
console.log(table);//length 30
//输出(30) [empty × 16, "3", empty × 2, "1", empty × 9, "2"]