-
Notifications
You must be signed in to change notification settings - Fork 33
/
73-Hashtable.js
81 lines (65 loc) · 2.2 KB
/
73-Hashtable.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
class HashTable {
constructor() {
this.size = 20
this.buckets = new Array(this.size)
// llevamos cada bucket con un map
for (let i = 0; i < this.buckets.length; i++) {
this.buckets[i] = new Map()
}
}
insert(key, value){
let idx = hash(key, this.size); // hasheamos la key
this.buckets[idx].set(key, value); // set es un metodo de map
}
remove(key){
let idx = hash(key, this.size);
let deleted = this.buckets[idx].get(key);
this.buckets[idx].delete(key); // borramos el item
return deleted;
}
search(key){
let idx = hash(key, this.size);
return this.buckets[idx].get(key);
}
}
const hash = (key, size) => {
let hashedKey = 0;
for (let i = 0; i < key.length; i++) {
hashedKey += key.charCodeAt(i);
}
return hashedKey % size;
}
const countWords = (stringToEval) => {
if (stringToEval.length === 0) return "No hay palabras";
// Creamos un hashtable
const hashTable = new HashTable();
// sacamos los caracteres especiales y pasamos todo a minuscula
stringToEval = stringToEval.replace(/[^\w\s]/gi, '').toLowerCase();
// Separamos por espacio cada palabra en un array
const words = stringToEval.split(' ');
// Recorremos cada palabra del array
words.forEach(element => {
// Si la palabra no esta en el hashTable, la insertamos
if (hashTable.search(element) === undefined) {
hashTable.insert(element, 1);
}
else {
// Si la palabra esta en el hashTable, la actualizamos
hashTable.insert(element, hashTable.search(element) + 1);
}
});
// creamos un array para guardar las respuestas
const arrayResponse = [];
// Recorremos el hashTable
for (let i = 0; i < hashTable.buckets.length; i++) {
// Si el bucket no esta vacio
if (hashTable.buckets[i].size > 0) {
// Recorremos el bucket tomando key y value
hashTable.buckets[i].forEach((value, key) => {
arrayResponse.push(key + ': ' + value);
});
}
}
return arrayResponse;
}
module.exports = countWords;