Пользовательская проблема HashMap с изменяемым размером в JavaScript,Javascript

Форум по Javascript
Ответить
Anonymous
 Пользовательская проблема HashMap с изменяемым размером в JavaScript,

Сообщение Anonymous »

Я работал над: https://www.theodinproject.com/lessons/ ... pt-hashmap
Но в последнее время я изо всех сил пытаюсь реализовать задачу по реализации хэш-карты с изменяемым размером.
До изменения размера hashMap все работает как задумано, но после изменения размера (когда добавляются пары значений ключа 12-14) и повторного хэширования удаленный ключ2 снова оказывается в hashMap.

Код: Выделить всё

class ResizableHashMap {
constructor(initialCapacity = 16, loadFactor = 0.75) {
this.buckets = new Array(initialCapacity).fill(null).map(() => []);
this.size = 0;
this.loadFactor = loadFactor;
}

hash(key) {
let hashCode = 0;
for (let char of key.toString()) {
hashCode += char.charCodeAt(0);
}
return hashCode % this.buckets.length;
}

set(key, value) {
if ((this.size + 1) / this.buckets.length > this.loadFactor) {
this.resize();
}
const index = this.hash(key);
const bucket = this.buckets[index];

for (let pair of bucket) {
if (pair[0] === key) {
pair[1] = value;
return;
}
}
bucket.push([key, value]);
this.size++;
}

resize() {
const newCapacity = this.buckets.length * 2;
const newBuckets = new Array(newCapacity).fill(null).map(() => []);

for (let bucket of this.buckets) {
for (let [key, value] of bucket) {
const index = this.hash(key) % newCapacity;
newBuckets[index].push([key, value]);
}
}
this.buckets = newBuckets;
}

// Delete key-value pair
delete(key) {
const index = this.hash(key);
const bucket = this.buckets[index];

for (let i = 0; i < bucket.length; i++) {
if (bucket[i][0] === key) {
bucket.splice(i, 1);
this.size--;
return true;
}
}
return false;
}
}

// Usage Example
const resizableHashMap = new ResizableHashMap();
resizableHashMap.set("key1", "value1");
resizableHashMap.set("key2", "value2");
resizableHashMap.set("key3", "value3");
resizableHashMap.set("key4", "value4");
resizableHashMap.set("key5", "value5");
resizableHashMap.set("key6", "value6");
resizableHashMap.set("key7", "value7");
resizableHashMap.set("key8", "value8");
resizableHashMap.set("key9", "value9");
resizableHashMap.set("key10", "value10");
resizableHashMap.set("key11", "value11");

// if these lines are commented out, it works as intended
resizableHashMap.set("key12", "value12");
resizableHashMap.set("key13", "value13");
resizableHashMap.set("key14", "value14");

resizableHashMap.set("key1", "updatedValue1");
// console.log(resizableHashMap);
resizableHashMap.delete("key2");
// console.log(resizableHashMap);
console.log(resizableHashMap.size);
// Output: 15, but should be 13 (added 14 keys and deleted 1)



Подробнее здесь: https://stackoverflow.com/questions/798 ... javascript
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»