public interface IMap<K,V> {
void clean();
boolean containKey(K key);
boolean containValue(V value);
V get(K key);
boolean isEmpty();
MyHashset keySet();
void put(K key, V value);
void putAll(IMap <? extends K,? extends V> map);
V remove(K key);
int size();
V[] values();
}
public class MyHashMap<K, V> implements IMap<K, V> {
private Node[] buckets = new Node[16];
int size;
private class Node<K, V> {
Node next;
K key;
V value;
public Node(K key, V value) {
this.key = key;
this.value = value;
}
}
@Override
public void clean() {
for (int i = 0; i < buckets.length; i++) {
buckets[i] = null;
}
}
@Override
public boolean containKey(K key) {
int Index = hash1(key);
if (buckets[Index] == null) {
return false;
} else {
Node<K, V> p = buckets[Index];
while (p != null) {
K k1 = p.key;
if (k1 == key || k1.hashCode() == key.hashCode() || k1.equals(key)) {
return true;
}
p = p.next;
}
}
return false;
}
@Override
public boolean containValue(V value) {
for (int i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
Node<K, V> p = buckets[i];
while (p != null) {
if (p.value.equals(value)) {
return true;
}
}
}
}
return false;
}
@Override
public V get(K key) {
int Index = hash1(key);
if (buckets[Index] == null) {
return null;
} else {
Node<K, V> p = buckets[Index];
while (p != null) {
if (p.hashCode() == key.hashCode() || p.key.equals(key)) {
return p.value;
}
p = p.next;
}
}
return null;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public MyHashset<K> keySet() {
MyHashset<K> set = new MyHashset<>();
for (int i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
Node<K, V> p = buckets[i];
while (p != null) {
set.add(p.key);
p=p.next;
}
}
}
return null;
}
@Override
public void put(K key, V value) {
Node<K, V> node = new Node<>(key, value);
int Index = hash1(key);
if (buckets[Index] != null) {
buckets[Index] = node;
size++;
} else {
Node<K, V> p = buckets[Index];
while (p != null) {
K k1 = p.key;
if (key == k1 || key.hashCode() == k1.hashCode() && key.equals(k1)) {
p.value = value;
break;
}
if (p.next == null) {
p.next = node;
size++;
break;
}
p = p.next;
}
}
}
private int hash1(K key) {
return key.hashCode() % 16;
}
@Override
public void putAll(IMap<? extends K, ? extends V> map) {
}
@Override
public V remove(K key) {
int Index = hash1(key);
if (buckets[Index] == null) {
return null;
} else {
Node<K, V> p = buckets[Index];
Node<K, V> pre = p;
while (p != null) {
K k1 = p.key;
if (k1.hashCode() == key.hashCode() && k1.equals(key)) {
if (pre == p) {
buckets[Index] = pre.next;
} else {
pre.next = p.next;
}
return p.value;
}
pre = p;
p = p.next;
}
}
return null;
}
@Override
public int size() {
return size;
}
@Override
public V[] values() {
return null;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < buckets.length; i++) {
if (buckets[i] != null) {
Node<K, V> p = buckets[i];
while (p != null) {
sb.append("(" + p.key + p.value + ")" + ",");
p=p.next;
}
}
}
return sb.toString();
}
}