diff --git a/src/main/java/core/basesyntax/MyHashMap.java b/src/main/java/core/basesyntax/MyHashMap.java index d9beffedf..cbb5e0d41 100644 --- a/src/main/java/core/basesyntax/MyHashMap.java +++ b/src/main/java/core/basesyntax/MyHashMap.java @@ -1,19 +1,99 @@ package core.basesyntax; public class MyHashMap implements MyMap { + private static final int INIT_CAP = 16; + private static final double MAX_SIZE = 0.75; + private int capacity; + private int size; + private double threshold; + private Node[] table; + + public MyHashMap() { + table = new Node[INIT_CAP]; + capacity = INIT_CAP; + threshold = INIT_CAP * MAX_SIZE; + } @Override public void put(K key, V value) { + if (size >= threshold) { + resize(); + } + int index = hash(key); + Node node = table[index]; + + if (node == null) { + table[index] = new Node<>(key, value, null); + size++; + return; + } + while (node != null) { + if ((key == node.key) || (key != null && key.equals(node.key))) { + node.value = value; + return; + } + if (node.next == null) { + node.next = new Node<>(key, value, null); + size++; + return; + } + node = node.next; + } } @Override public V getValue(K key) { + int index = hash(key); + Node node = table[index]; + while (node != null) { + if ((key == node.key) || (key != null && key.equals(node.key))) { + return node.value; + } + node = node.next; + } return null; } @Override public int getSize() { - return 0; + return size; + } + + private void resize() { + size = 0; + int oldCapacity = capacity; + capacity += capacity; + Node[] oldTable = table; + table = (Node[]) new Node[capacity]; + for (int i = 0; i < oldCapacity; i++) { + Node node = oldTable[i]; + + while (node != null) { + Node next = node.next; + put(node.key, node.value); + node = next; + } + } + threshold = capacity * MAX_SIZE; + } + + private int hash(Object key) { + if (key == null) { + return 0; + } + return Math.abs(key.hashCode() % capacity); + } + + private static class Node { + private K key; + private V value; + private Node next; + + public Node(K key, V value, Node next) { + this.key = key; + this.value = value; + this.next = next; + } } }