fix: handle deleted slots
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user