This commit is contained in:
61
node_modules/licia/HashTable.js
generated
vendored
Normal file
61
node_modules/licia/HashTable.js
generated
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
var Class = require('./Class');
|
||||
var LinkedList = require('./LinkedList');
|
||||
var map = require('./map');
|
||||
var strHash = require('./strHash');
|
||||
var has = require('./has');
|
||||
exports = Class({
|
||||
initialize: function HashTable() {
|
||||
var size =
|
||||
arguments.length > 0 && arguments[0] !== undefined
|
||||
? arguments[0]
|
||||
: 32;
|
||||
this._buckets = map(Array(size), function() {
|
||||
return new LinkedList();
|
||||
});
|
||||
this._keys = {};
|
||||
},
|
||||
set: function(key, val) {
|
||||
var keyHash = this._hash(key);
|
||||
this._keys[key] = keyHash;
|
||||
var linkedList = this._buckets[keyHash];
|
||||
var node = linkedList.find(function(val) {
|
||||
return val.key === key;
|
||||
});
|
||||
if (!node) {
|
||||
linkedList.push({
|
||||
key: key,
|
||||
value: val
|
||||
});
|
||||
} else {
|
||||
node.value.value = val;
|
||||
}
|
||||
},
|
||||
get: function(key) {
|
||||
var linkedList = this._buckets[this._hash(key)];
|
||||
var node = linkedList.find(function(val) {
|
||||
return val.key === key;
|
||||
});
|
||||
if (node) {
|
||||
return node.value.value;
|
||||
}
|
||||
},
|
||||
has: function(key) {
|
||||
return has(this._keys, key);
|
||||
},
|
||||
delete: function(key) {
|
||||
var keyHash = this._hash(key);
|
||||
delete this._keys[key];
|
||||
var linkedList = this._buckets[keyHash];
|
||||
var node = linkedList.find(function(val) {
|
||||
return val.key === key;
|
||||
});
|
||||
if (node) {
|
||||
linkedList.rmNode(node);
|
||||
}
|
||||
},
|
||||
_hash: function(key) {
|
||||
return strHash(key) % this._buckets.length;
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = exports;
|
||||
Reference in New Issue
Block a user