fix: handle deleted slots

This commit is contained in:
user
2026-09-12 20:38:04 +04:00
parent b46ae2b8f2
commit 330344821b
@@ -1,5 +1,7 @@
package org.example; package org.example;
import java.util.Objects;
public class MyHashMap<Key, Value> { public class MyHashMap<Key, Value> {
private Key[] keys; private Key[] keys;
@@ -24,11 +26,22 @@ public class MyHashMap<Key, Value> {
resize(); resize();
} }
int index = findEmptyIndex(key); int index = index(key);
if (keys[index] != null) { int start = index;
Value oldValue = values[index];
values[index] = value; while (keys[index] != null || deleted[index]) {
return oldValue; if (!deleted[index] && Objects.equals(keys[index], key)) {
Value oldValue = values[index];
values[index] = value;
return oldValue;
}
index = (index + 1) % keys.length;
if (index == start) {
resize();
return put(key, value);
}
} }
keys[index] = key; keys[index] = key;
@@ -58,7 +71,7 @@ public class MyHashMap<Key, Value> {
int start = index; int start = index;
while (keys[index] != null || deleted[index]) { while (keys[index] != null || deleted[index]) {
if (!deleted[index] && java.util.Objects.equals(keys[index], key)) { if (!deleted[index] && Objects.equals(keys[index], key)) {
return index; return index;
} }
@@ -72,28 +85,8 @@ public class MyHashMap<Key, Value> {
return -1; return -1;
} }
private int findEmptyIndex(Key key) {
int index = index(key);
int start = index;
while (keys[index] != null && !deleted[index]) {
if (java.util.Objects.equals(keys[index], key)) {
return index;
}
index = (index + 1) % keys.length;
if (index == start) {
resize();
return findEmptyIndex(key);
}
}
return index;
}
private int index(Key key) { private int index(Key key) {
return Math.floorMod(key == null ? 0 : key.hashCode(), keys.length); return Math.floorMod(key.hashCode(), keys.length);
} }
private void resize() { private void resize() {