JavaScript_SA 字典 hashtable

在字典中,存储的是[键,值]对,其中键名是用来查询特定元素的。字典和集合很相似,集合以[值,值]的形式存储元素,字典则是以[键,值]的形式来存储元素。字典也称作映射。
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"]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值