Java实现TestMap类,要求只实现get、put、remove、size四个方法
1、问题:实现TestMap类,要求只实现get、put、remove、size四个方法
2、代码实现
import java.util.Collection;
import java.util.Map;
import java.util.Set;
class Node<K,V> {
int hash;
K key;
V value;
Node<K,V> next;
}
public class TestMap<K, V> implements Map<K, V> {
private Node[] table;//位桶数组。bucket array
private int size;//存放的键值对的个数
public TestMap() {
table = new Node[16];//长度一般定义成2的整数幂
}
public static int myHash(int v, int length) {
System.out.println(v + " hash in myHash:" + (v & (length - 1)));
return v & (length - 1);
}
@Override
public int size() {
//System.out.println("HashSize:"+ size);
return size;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean containsKey(Object key) {
return false;
}
@Override
public boolean containsValue(Object value) {
return false;
}
@Override
public V get(Object key) {
//通过Hash和Key获取Node,就得到Node.value
int hash = myHash(key.hashCode(), table.length);
V value = null;
if (table[hash] != null) {
Node<K,V> temp = table[hash];
while (temp != null) {
if (temp.key.equals(key)) {//如果相等,则说明找到了键值对,返回相应的value
value = temp.value;
break;
} else {
temp = temp.next;
}
}
}
return value;
}
@Override
public V put(K key, V value) {
//定义新的节点对象
Node<K,V> newNode = new Node();
newNode.hash = myHash(key.hashCode(),table.length);
newNode.key = key;
newNode.value = value;
newNode.next = null;
Node<K,V> temp = table[newNode.hash];
Node<K,V> iterLast = null;//正在遍历的最后一个元素
boolean keyRepeat = false;
if(temp == null) {
//此处数组元素为空,则直接将新节点放进去
table[newNode.hash] = newNode;
size++;
}else {
//此处数组元素不为空。则遍历对应链表。。
while(temp!=null) {
//判断key如果重复,则覆盖
if(temp.key.equals(key)) {
keyRepeat = true;
System.out.println("key重复!");
temp.value = value;//只是覆盖value即可。其他的值(hash,key,next)保持不变。
break;
}else {
//key不重复,则遍历下一个
iterLast = temp;
temp = temp.next;
}
}
if(!keyRepeat) {
iterLast = newNode;
size++;
}
}
return null;
}
@Override
public V remove(Object key) {
//定义新的节点对象
Node<Object,V> newNode = new Node<Object,V>();
newNode.hash = myHash(key.hashCode(), table.length);
newNode.key = key;
newNode.value = null;
newNode.next = null;
Node<K,V> temp = table[newNode.hash];
Node<K,V> preNode = null;//key匹配的前一个节点
boolean keyRepeat = false;
if (temp == null) {
return null;
} else {
preNode = temp;
int current = 0;
//此处数组元素不为空。则遍历对应链表。。
while (temp != null) {
//判断key相等
if (temp.key.equals(key)) {
if(current == 0){
//说明是第一个元素
table[newNode.hash].next = temp.next;
}else{
preNode.next = temp.next;//删除当前节点
}
size--;
return temp.value;
} else {
//key不相等,则遍历下一个
preNode = temp;
temp = temp.next;
current++;
}
}
}
return null;
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
}
@Override
public void clear() {
}
@Override
public Set<K> keySet() {
return null;
}
@Override
public Collection<V> values() {
return null;
}
@Override
public Set<Entry<K, V>> entrySet() {
return null;
}
public static void main(String[] args) {
TestMap testMap = new TestMap<Integer,String>();
testMap.put(10, "aa");
testMap.put(20, "bb");
testMap.put(30, "cc");
testMap.put(20, "dd");
System.out.println(testMap.size()); //3
System.out.println(testMap.get(10)); //aa
testMap.remove(10);
System.out.println(testMap.size()); //2
}
}