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;
import java.util.Objects;
public class MyHashMap<Key, Value> {
private Key[] keys;
@@ -24,11 +26,22 @@ public class MyHashMap<Key, Value> {
resize();
}
int index = findEmptyIndex(key);
if (keys[index] != null) {
Value oldValue = values[index];
values[index] = value;
return oldValue;
int index = index(key);
int start = index;
while (keys[index] != null || deleted[index]) {
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;
@@ -58,7 +71,7 @@ public class MyHashMap<Key, Value> {
int start = 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;
}
@@ -72,28 +85,8 @@ public class MyHashMap<Key, Value> {
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) {
return Math.floorMod(key == null ? 0 : key.hashCode(), keys.length);
return Math.floorMod(key.hashCode(), keys.length);
}
private void resize() {