33 * @author Adrian Mejia <me AT adrianmejia.com>
44 */
55class HashMap {
6-
76 /**
87 * Initialize array that holds the values. Default is size 1,000
98 * @param {number } initialCapacity initial size of the array
@@ -50,23 +49,23 @@ class HashMap {
5049 * @param {any } value
5150 */
5251 set ( key , value ) {
53- const { bucketIndex, entryIndex} = this . _getIndexes ( key ) ;
52+ const { bucketIndex, entryIndex } = this . _getIndexes ( key ) ;
5453
55- if ( entryIndex === undefined ) {
54+ if ( entryIndex === undefined ) {
5655 // initialize array and save key/value
57- const keyIndex = this . keys . push ( { content : key } ) - 1 ; // keep track of the key index
56+ const keyIndex = this . keys . push ( { content : key } ) - 1 ; // keep track of the key index
5857 this . buckets [ bucketIndex ] = this . buckets [ bucketIndex ] || [ ] ;
59- this . buckets [ bucketIndex ] . push ( { key, value, keyIndex} ) ;
58+ this . buckets [ bucketIndex ] . push ( { key, value, keyIndex } ) ;
6059 this . size ++ ;
6160 // Optional: keep count of collisions
62- if ( this . buckets [ bucketIndex ] . length > 1 ) { this . collisions ++ ; }
61+ if ( this . buckets [ bucketIndex ] . length > 1 ) { this . collisions ++ ; }
6362 } else {
6463 // override existing value
6564 this . buckets [ bucketIndex ] [ entryIndex ] . value = value ;
6665 }
6766
6867 // check if a rehash is due
69- if ( this . loadFactor > 0 && this . getLoadFactor ( ) > this . loadFactor ) {
68+ if ( this . loadFactor > 0 && this . getLoadFactor ( ) > this . loadFactor ) {
7069 this . rehash ( this . buckets . length * 2 ) ;
7170 }
7271
@@ -79,9 +78,9 @@ class HashMap {
7978 * @param {any } key
8079 */
8180 get ( key ) {
82- const { bucketIndex, entryIndex} = this . _getIndexes ( key ) ;
81+ const { bucketIndex, entryIndex } = this . _getIndexes ( key ) ;
8382
84- if ( entryIndex === undefined ) {
83+ if ( entryIndex === undefined ) {
8584 return ;
8685 }
8786
@@ -107,22 +106,22 @@ class HashMap {
107106
108107 for ( let entryIndex = 0 ; entryIndex < values . length ; entryIndex ++ ) {
109108 const entry = values [ entryIndex ] ;
110- if ( entry . key === key ) {
111- return { bucketIndex, entryIndex} ;
109+ if ( entry . key === key ) {
110+ return { bucketIndex, entryIndex } ;
112111 }
113112 }
114113
115- return { bucketIndex} ;
114+ return { bucketIndex } ;
116115 }
117116
118117 /**
119118 * Returns true if an element in the Map object existed and has been removed, or false if the element does not exist.
120119 * @param {any } key
121120 */
122121 delete ( key ) {
123- const { bucketIndex, entryIndex, keyIndex} = this . _getIndexes ( key ) ;
122+ const { bucketIndex, entryIndex, keyIndex } = this . _getIndexes ( key ) ;
124123
125- if ( entryIndex === undefined ) {
124+ if ( entryIndex === undefined ) {
126125 return false ;
127126 }
128127
@@ -140,8 +139,8 @@ class HashMap {
140139 rehash ( newCapacity ) {
141140 const newMap = new HashMap ( newCapacity ) ;
142141
143- this . keys . forEach ( key => {
144- if ( key ) {
142+ this . keys . forEach ( ( key ) => {
143+ if ( key ) {
145144 newMap . set ( key . content , this . get ( key . content ) ) ;
146145 }
147146 } ) ;
@@ -167,6 +166,7 @@ const hashMap = new HashMap(1);
167166// const hashMap = new Map();
168167
169168const assert = require ( 'assert' ) ;
169+
170170assert . equal ( hashMap . size , 0 ) ;
171171hashMap . set ( 'cat' , 2 ) ;
172172assert . equal ( hashMap . size , 1 ) ;
@@ -213,32 +213,32 @@ assert.equal(hashMap.getLoadFactor(), 5);
213213hashMap . rehash ( 1000 ) ;
214214console . log ( hashMap . collisions ) ;
215215console . log ( hashMap . buckets ) ;
216- assert . equal ( hashMap . getLoadFactor ( ) , 5 / 1000 ) ;
216+ assert . equal ( hashMap . getLoadFactor ( ) , 5 / 1000 ) ;
217217
218218// automatic rehashing based on loadFactor
219219const dynamicMap = new HashMap ( 2 , 0.75 ) ;
220220
221221dynamicMap . set ( 'uno' , 1 ) ;
222222assert . equal ( dynamicMap . buckets . length , 2 ) ;
223- assert . equal ( dynamicMap . getLoadFactor ( ) , 1 / 2 ) ;
223+ assert . equal ( dynamicMap . getLoadFactor ( ) , 1 / 2 ) ;
224224console . log ( hashMap . collisions ) ;
225225
226226dynamicMap . set ( 'dos' , 2 ) ;
227227assert . equal ( dynamicMap . buckets . length , 4 ) ; // <-- rehash took place
228- assert . equal ( dynamicMap . getLoadFactor ( ) , 1 / 2 ) ;
228+ assert . equal ( dynamicMap . getLoadFactor ( ) , 1 / 2 ) ;
229229console . log ( hashMap . collisions ) ;
230230
231231dynamicMap . set ( 'tres' , 3 ) ;
232232assert . equal ( dynamicMap . buckets . length , 4 ) ; // <-- no rehash
233- assert . equal ( dynamicMap . getLoadFactor ( ) , 3 / 4 ) ;
233+ assert . equal ( dynamicMap . getLoadFactor ( ) , 3 / 4 ) ;
234234console . log ( hashMap . collisions ) ;
235235
236236dynamicMap . set ( 'cuatro' , 4 ) ;
237237assert . equal ( dynamicMap . buckets . length , 8 ) ; // <-- rehash took place
238- assert . equal ( dynamicMap . getLoadFactor ( ) , 4 / 8 ) ;
238+ assert . equal ( dynamicMap . getLoadFactor ( ) , 4 / 8 ) ;
239239console . log ( hashMap . collisions ) ;
240240
241241dynamicMap . set ( 'cinco' , 5 ) ;
242242assert . equal ( dynamicMap . buckets . length , 8 ) ; // <-- no rehash
243- assert . equal ( dynamicMap . getLoadFactor ( ) , 5 / 8 ) ;
244- console . log ( hashMap . collisions ) ;
243+ assert . equal ( dynamicMap . getLoadFactor ( ) , 5 / 8 ) ;
244+ console . log ( hashMap . collisions ) ;
0 commit comments