From d362b2761b2d14d5f7e85db6c807c17c7d5c3109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filipe=20Falc=C3=A3o?= Date: Sat, 23 May 2015 15:53:46 -0300 Subject: [PATCH] Handle collision in the HashMap #66 --- src/data-structures/hash-table.js | 65 ++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/src/data-structures/hash-table.js b/src/data-structures/hash-table.js index 18a327f4..7ef4f63c 100644 --- a/src/data-structures/hash-table.js +++ b/src/data-structures/hash-table.js @@ -18,14 +18,21 @@ * HashTable.remove(10); * HashTable.remove('key'); * - * console.log(HashTable.get(10)); // 'undefined' - * console.log(HashTable.get('key')); // 'undefined' + * console.log(HashTable.get(10)); // null + * console.log(HashTable.get('key')); // null * * @module data-structures/hash-table */ (function (exports) { 'use strict'; + exports.Node = function (key, data) { + this.key = key; + this.data = data; + this.next = null; + this.prev = null; + }; + exports.HashTable = function () { this.elements = []; }; @@ -41,25 +48,71 @@ for (i = 0; i < str.length; i += 1) { character = str.charCodeAt(i); + /*jshint -W016 */ hashCode = ((hashCode << 5) - hashCode) + character; hashCode = hashCode & hashCode; + /*jshint -W016 */ } return hashCode; }; - exports.HashTable.prototype.put = function (key, value) { + exports.HashTable.prototype.put = function (key, data) { var hashCode = this.hashCode(key); - this.elements[hashCode] = value; + var newNode = new Node(key, data); + + if (this.elements[hashCode] === null) { + this.elements[hashCode] = newNode; + } else { + var first = this.elements[hashCode]; + + while (first.next !== null) { + first = first.next; + } + + first.next = newNode; + newNode.prev = first; + } }; exports.HashTable.prototype.get = function (key) { var hashCode = this.hashCode(key); - return this.elements[hashCode]; + + if (this.elements[hashCode] === null) { + return null; + } else if (this.elements[hashCode].next === null) { + return this.elements[hashCode]; + } else { + var first = this.elements[hashCode]; + + while (first.key !== key) { + first = first.next; + } + + return first; + } }; exports.HashTable.prototype.remove = function (key) { var hashCode = this.hashCode(key); - this.elements.splice(hashCode, 1); + + if (this.elements[hashCode] === null) { + return false; + } else if (this.elements[hashCode].next === null) { + this.elements.splice(hashCode, 1); + return true; + } else { + var first = this.elements[hashCode]; + + while (first.key !== key) { + first = first.next; + } + + if (first.next !== null) { + first.next.prev = first.prev; + } + + first.prev.next = first.next; + } }; })(typeof window === 'undefined' ? module.exports : window);