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

    }
}

引用借鉴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeRain程序雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值