Skip to content

Commit 5ec1287

Browse files
committed
chapter 07: [Dictionaries and Hashes]
1 parent 188bbc2 commit 5ec1287

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+4370
-8
lines changed

.eslintrc.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"no-console": 0,
2525
"import/prefer-default-export": 0,
2626
"comma-dangle": 0,
27-
"no-underscore-dangle": 0
27+
"no-underscore-dangle": 0,
28+
"no-param-reassign": 0
2829
}
2930
}

README.md

+21
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Work in Progress.
1616
* 04: [Queues and Deques](https://github.com/loiane/javascript-datastructures-algorithms/tree/third-edition/examples/chapter04)
1717
* 05: [LinkedLists](https://github.com/loiane/javascript-datastructures-algorithms/tree/third-edition/examples/chapter05)
1818
* 06: [Sets](https://github.com/loiane/javascript-datastructures-algorithms/tree/third-edition/examples/chapter06)
19+
* 07: [Dictionaries and Hashes](https://github.com/loiane/javascript-datastructures-algorithms/tree/third-edition/examples/chapter07)
1920

2021
### Third Edition Updates
2122

@@ -27,6 +28,26 @@ Work in Progress.
2728
* Algorithms tested with Mocha + Chai (test code available in `test` directory)
2829
* **TypeScript** version of the source code included (library and tests)
2930

31+
## Project Structure
32+
33+
`src/js/index.js` file contains all the data structures and algorithms listed by chapter.
34+
35+
```
36+
|_examples (how to use each data structure and algorithm, organized by chapter)
37+
|_src
38+
|___js (source code: JavaScript version)
39+
|_____data-structures
40+
|_______models (classes used by DS: Node, ValuePair, ...)
41+
|_____others (other algorithms such as palindome checker, hanoi tower)
42+
|___ts (source code: TypeScript version)
43+
|_____data-structures
44+
|_______models
45+
|_____others
46+
|_test (unit tests with Mocha and Chai for src)
47+
|___js (tests for JavaScript code)
48+
|___ts (tests for TypeScript code)
49+
```
50+
3051
## Installing and running the book examples With Node
3152

3253
* Install [Node](https://nodejs.org)

examples/PacktDataStructuresAlgorithms.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="./../PacktDataStructuresAlgorithms.min.js"></script>
9+
<script src="01-Dictionaries.js"></script>
10+
</body>
11+
</html>

examples/chapter07/01-Dictionaries.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const { Dictionary } = PacktDataStructuresAlgorithms;
2+
3+
const dictionary = new Dictionary();
4+
5+
dictionary.set('Gandalf', 'gandalf@email.com');
6+
dictionary.set('John', 'johnsnow@email.com');
7+
dictionary.set('Tyrion', 'tyrion@email.com');
8+
9+
console.log(dictionary.hasKey('Gandalf')); // true
10+
console.log(dictionary.size()); // 3
11+
12+
console.log(dictionary.keys()); // ["Gandalf", "John", "Tyrion"]
13+
console.log(dictionary.values()); // ["gandalf@email.com", "johnsnow@email.com", "tyrion@email.com"]
14+
console.log(dictionary.get('Tyrion')); // tyrion@email.com
15+
16+
dictionary.remove('John');
17+
18+
console.log(dictionary.keys()); // ["Gandalf", "Tyrion"]
19+
console.log(dictionary.values()); // ["gandalf@email.com", "tyrion@email.com"]
20+
21+
console.log(dictionary.keyValues()); // [{key: "Gandalf", value: "gandalf@email.com"}, {key: "Tyrion", value: "tyrion@email.com"}]
22+
console.log(dictionary.toString()); // [#Gandalf: gandalf@email.com],[#Tyrion: tyrion@email.com]

examples/chapter07/02-HashTable.html

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="./../PacktDataStructuresAlgorithms.min.js"></script>
9+
<script src="02-HashTable.js"></script>
10+
</body>
11+
</html>

examples/chapter07/02-HashTable.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const { HashTable } = PacktDataStructuresAlgorithms;
2+
3+
const hash = new HashTable();
4+
5+
hash.put('Gandalf', 'gandalf@email.com');
6+
hash.put('John', 'johnsnow@email.com');
7+
hash.put('Tyrion', 'tyrion@email.com');
8+
hash.put('Aaron', 'aaron@email.com');
9+
hash.put('Donnie', 'donnie@email.com');
10+
hash.put('Ana', 'ana@email.com');
11+
hash.put('Jonathan', 'jonathan@email.com');
12+
hash.put('Jamie', 'jamie@email.com');
13+
hash.put('Sue', 'sue@email.com');
14+
hash.put('Mindy', 'mindy@email.com');
15+
hash.put('Paul', 'paul@email.com');
16+
hash.put('Nathan', 'nathan@email.com');
17+
18+
console.log('**** Printing Hash **** ');
19+
20+
console.log(hash.toString());
21+
// {5 => [#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Ana: ana@email.com]},{16 => [#Aaron: aaron@email.com]},{19 => [#Gandalf: gandalf@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Paul: paul@email.com]}
22+
23+
console.log('**** Get **** ');
24+
25+
console.log(hash.get('Gandalf')); // gandalf@email.com
26+
console.log(hash.get('Loiane')); // undefined
27+
28+
console.log('**** Remove **** ');
29+
30+
hash.remove('Gandalf');
31+
console.log(hash.get('Gandalf')); // undefined
32+
33+
console.log(hash.toString());
34+
// {5 => [#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Ana: ana@email.com]},{16 => [#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Paul: paul@email.com]}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="./../PacktDataStructuresAlgorithms.min.js"></script>
9+
<script src="03-HashCollisionSeparateChaining.js"></script>
10+
</body>
11+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
const { HashTableSeparateChaining } = PacktDataStructuresAlgorithms;
2+
3+
const hashTable = new HashTableSeparateChaining();
4+
5+
hashTable.put('Gandalf', 'gandalf@email.com');
6+
hashTable.put('John', 'johnsnow@email.com');
7+
hashTable.put('Tyrion', 'tyrion@email.com');
8+
hashTable.put('Aaron', 'aaron@email.com');
9+
hashTable.put('Donnie', 'donnie@email.com');
10+
hashTable.put('Ana', 'ana@email.com');
11+
hashTable.put('Jonathan', 'jonathan@email.com');
12+
hashTable.put('Jamie', 'jamie@email.com');
13+
hashTable.put('Sue', 'sue@email.com');
14+
hashTable.put('Mindy', 'mindy@email.com');
15+
hashTable.put('Paul', 'paul@email.com');
16+
hashTable.put('Nathan', 'nathan@email.com');
17+
18+
console.log('**** Printing Hash **** ');
19+
20+
console.log(hashTable.toString());
21+
// {5 => [#Jonathan: jonathan@email.com],[#Jamie: jamie@email.com],[#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com],[#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com],[#Aaron: aaron@email.com]},{19 => [#Gandalf: gandalf@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com],[#Paul: paul@email.com]}
22+
23+
console.log('**** Get **** ');
24+
25+
console.log(hashTable.get('Jamie')); // jamie@email.com
26+
console.log(hashTable.get('Sue')); // sue@email.com
27+
console.log(hashTable.get('Jonathan')); // jonathan@email.com
28+
console.log(hashTable.get('Loiane')); // undefined
29+
30+
console.log('**** Remove **** ');
31+
32+
console.log(hashTable.remove('Gandalf')); // true
33+
console.log(hashTable.get('Gandalf')); // undefined
34+
console.log(hashTable.toString());
35+
// {5 => [#Jonathan: jonathan@email.com],[#Jamie: jamie@email.com],[#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com],[#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com],[#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com],[#Paul: paul@email.com]}
36+
37+
console.log(hashTable.remove('Sue')); // true
38+
console.log(hashTable.toString());
39+
// {5 => [#Jonathan: jonathan@email.com],[#Jamie: jamie@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com],[#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com],[#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com],[#Paul: paul@email.com]}
40+
41+
console.log(hashTable.remove('Jamie')); // true
42+
console.log(hashTable.toString());
43+
// {5 => [#Jonathan: jonathan@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com],[#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com],[#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com],[#Paul: paul@email.com]}
44+
45+
console.log(hashTable.remove('Donnie')); // true
46+
console.log(hashTable.toString());
47+
// {5 => [#Jonathan: jonathan@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com],[#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com],[#Paul: paul@email.com]}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="./../PacktDataStructuresAlgorithms.min.js"></script>
9+
<script src="04-HashCollisionLinearProbing.js"></script>
10+
</body>
11+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const { HashTableLinearProbing } = PacktDataStructuresAlgorithms;
2+
3+
const hashTable = new HashTableLinearProbing();
4+
5+
hashTable.put('Gandalf', 'gandalf@email.com');
6+
hashTable.put('John', 'johnsnow@email.com');
7+
hashTable.put('Tyrion', 'tyrion@email.com');
8+
hashTable.put('Aaron', 'aaron@email.com');
9+
hashTable.put('Donnie', 'donnie@email.com');
10+
hashTable.put('Ana', 'ana@email.com');
11+
hashTable.put('Jonathan', 'jonathan@email.com');
12+
hashTable.put('Jamie', 'jamie@email.com');
13+
hashTable.put('Sue', 'sue@email.com');
14+
hashTable.put('Mindy', 'mindy@email.com');
15+
hashTable.put('Paul', 'paul@email.com');
16+
hashTable.put('Nathan', 'nathan@email.com');
17+
18+
console.log('**** Printing Hash **** ');
19+
20+
console.log(hashTable.toString());
21+
// {5 => [#Jonathan: jonathan@email.com]},{6 => [#Jamie: jamie@email.com]},{7 => [#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com]},{14 => [#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com]},{17 => [#Aaron: aaron@email.com]},{19 => [#Gandalf: gandalf@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com]},{33 => [#Paul: paul@email.com]}
22+
23+
console.log('**** Get **** ');
24+
25+
console.log(hashTable.get('Nathan')); // nathan@email.com
26+
console.log(hashTable.get('Loiane')); // undefined
27+
28+
console.log('**** Remove **** ');
29+
30+
hashTable.remove('Gandalf');
31+
console.log(hashTable.get('Gandalf')); // undefined
32+
console.log(hashTable.toString());
33+
// {5 => [#Jonathan: jonathan@email.com]},{6 => [#Jamie: jamie@email.com]},{7 => [#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com]},{14 => [#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com]},{17 => [#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com]},{33 => [#Paul: paul@email.com]}
34+
35+
console.log('**** Remove Test 2 **** ');
36+
console.log('Removing Jonathan', hashTable.remove('Jonathan')); // true
37+
console.log('**** Print **** ');
38+
console.log(hashTable.toString());
39+
// {5 => [#Jamie: jamie@email.com]},{6 => [#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com]},{14 => [#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com]},{17 => [#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com]},{33 => [#Paul: paul@email.com]}
40+
41+
console.log(hashTable.get('Jamie')); // jamie@email.com
42+
console.log('**** Print **** ');
43+
console.log(hashTable.toString());
44+
// {5 => [#Jamie: jamie@email.com]},{6 => [#Sue: sue@email.com]},{10 => [#Nathan: nathan@email.com]},{13 => [#Donnie: donnie@email.com]},{14 => [#Ana: ana@email.com]},{16 => [#Tyrion: tyrion@email.com]},{17 => [#Aaron: aaron@email.com]},{29 => [#John: johnsnow@email.com]},{32 => [#Mindy: mindy@email.com]},{33 => [#Paul: paul@email.com]}

examples/chapter07/05-ES2015Map.html

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="05-ES2015Map.js"></script>
9+
</body>
10+
</html>

examples/chapter07/05-ES2015Map.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const map = new Map();
2+
3+
map.set('Gandalf', 'gandalf@email.com');
4+
map.set('John', 'johnsnow@email.com');
5+
map.set('Tyrion', 'tyrion@email.com');
6+
7+
console.log(map.has('Gandalf')); // true
8+
console.log(map.size); // 3
9+
10+
console.log(map.keys()); // MapIterator {"Gandalf", "John", "Tyrion"}
11+
console.log(map.values()); // MapIterator {"gandalf@email.com", "johnsnow@email.com", "tyrion@email.com"}
12+
console.log(map.get('Tyrion')); // tyrion@email.com
13+
14+
map.delete('John');
15+
16+
console.log(map.keys()); // MapIterator {"Gandalf", "Tyrion"}
17+
console.log(map.values()); // MapIterator {"gandalf@email.com", "tyrion@email.com"}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="06-ES2015WeakMap.js"></script>
9+
</body>
10+
</html>
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const map = new WeakMap();
2+
3+
const ob1 = { name: 'Gandalf' };
4+
const ob2 = { name: 'John' };
5+
const ob3 = { name: 'Tyrion' };
6+
7+
map.set(ob1, 'gandalf@email.com');
8+
map.set(ob2, 'johnsnow@email.com');
9+
map.set(ob3, 'tyrion@email.com');
10+
11+
console.log(map.has(ob1)); // true
12+
console.log(map.has(ob2)); // true
13+
console.log(map.has(ob3)); // true
14+
15+
console.log(map.get(ob3)); // tyrion@email.com
16+
17+
map.delete(ob2);
18+
console.log(map.has(ob2)); // false
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title></title>
6+
</head>
7+
<body>
8+
<script src="07-ES2015WeakSet.js"></script>
9+
</body>
10+
</html>
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
var set = new WeakSet();
2+
3+
const ob1 = { name: 'Gandalf' };
4+
const ob2 = { name: 'John' };
5+
const ob3 = { name: 'Tyrion' };
6+
7+
set.add(ob1);
8+
set.add(ob2);
9+
set.add(ob3);
10+
11+
console.log(set.has(ob1)); // true
12+
console.log(set.has(ob2)); // true
13+
console.log(set.has(ob3)); // true
14+
15+
set.delete(ob2);
16+
console.log(set.has(ob2)); // false

examples/index.html

+14-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
<a href="#scroll-tab-4" class="mdl-layout__tab">04</a>
4545
<a href="#scroll-tab-5" class="mdl-layout__tab">05</a>
4646
<a href="#scroll-tab-6" class="mdl-layout__tab">06</a>
47+
<a href="#scroll-tab-7" class="mdl-layout__tab">07</a>
4748
</div>
4849
</header>
4950
<main class="mdl-layout__content">
@@ -156,7 +157,19 @@
156157
</section>
157158
<section class="mdl-layout__tab-panel" id="scroll-tab-7">
158159
<div class="page-content">
159-
Soon.
160+
<div class="page-content mdl-layout--fixed-drawer">
161+
<div class="mdl-layout__drawer is-visible">
162+
<nav class="mdl-navigation">
163+
<a class="mdl-navigation__link" href="chapter07/01-Dictionaries.html">01-Dictionaries</a>
164+
<a class="mdl-navigation__link" href="chapter07/02-HashTable.html">02-HashTable</a>
165+
<a class="mdl-navigation__link" href="chapter07/03-HashCollisionSeparateChaining.html">03-HashCollision SeparateChaining</a>
166+
<a class="mdl-navigation__link" href="chapter07/04-HashCollisionLinearProbing.html">04-HashCollision LinearProbing</a>
167+
<a class="mdl-navigation__link" href="chapter07/05-ES2015Map.html">05-ES2015 Map</a>
168+
<a class="mdl-navigation__link" href="chapter07/06-ES2015WeakMap.html">06-ES2015 WeakMap</a>
169+
<a class="mdl-navigation__link" href="chapter07/07-ES2015WeakSet.html">07-ES2015 WeakSet</a>
170+
</nav>
171+
</div>
172+
</div>
160173
</div>
161174
</section>
162175
<section class="mdl-layout__tab-panel" id="scroll-tab-8">

package.json

+6-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
"test:js": "mocha --compilers js:babel-core/register ./test/js/**/*.spec.js --reporter mochawesome",
2525
"test:ts": "mocha -r ts-node/register --recursive ./test/ts/**/*.spec.ts",
2626
"test": "npm run test:js && npm run test:ts",
27-
"dev": "npm run clean && npm run lint && npm run webpack && npm run generate-report2",
27+
"dev": "npm run clean && npm run lint && npm run webpack && npm run generate-report",
28+
"dev2": "npm run clean && npm run lint && npm run webpack && npm run generate-report2",
2829
"coverage": "npm run generate-report && nyc report --reporter=text-lcov > coverage.lcov && codecov",
2930
"generate-report": "nyc --report-dir coverage npm run test && nyc report --reporter=text",
3031
"generate-report2": "nyc --report-dir coverage npm run test",
@@ -53,7 +54,7 @@
5354
},
5455
"devDependencies": {
5556
"@types/chai": "^4.0.4",
56-
"@types/mocha": "^2.2.43",
57+
"@types/mocha": "^2.2.44",
5758
"babel-cli": "^6.26.0",
5859
"babel-core": "^6.26.0",
5960
"babel-eslint": "^8.0.1",
@@ -62,8 +63,8 @@
6263
"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
6364
"babel-preset-env": "^1.6.1",
6465
"chai": "^4.1.2",
65-
"codecov": "^2.3.1",
66-
"eslint": "^4.9.0",
66+
"codecov": "^3.0.0",
67+
"eslint": "^4.10.0",
6768
"eslint-config-airbnb-base": "^12.1.0",
6869
"eslint-plugin-import": "^2.8.0",
6970
"istanbul": "^v1.1.0-alpha.1",
@@ -74,6 +75,6 @@
7475
"tslint": "^5.8.0",
7576
"typescript": "^2.5.3",
7677
"webpack": "^3.8.1",
77-
"yargs": "^9.0.1"
78+
"yargs": "^10.0.3"
7879
}
7980
}

0 commit comments

Comments
 (0)