利用链表实现Map底层

     今天我在这里利用链表实现一个Java常用集合中Map(K,V),map对于学java的都应该熟知,map用来解决高效的分拣、快速的读取有很大的帮助。

     接下来,我就直接贴上我的代码

     Map接口:

public interface Map{
  //增加
  void add(K key,V value);
  //移除
  V remove(K key);
  //是否包含
  boolean contains(K key);
  //根据键获取值
  V get(K key);
  //设置值
  void set(K key,V newValue);
  //得到长度
  int getSize();
  //判断是否为空
  boolean isEmpty();
}

 实现类:LinkedListMap

public class LinkedListMap implements Map{
    //节点类
    private class Node{
       public K key;
       public V value;
       public Node next;
       public Node(K key,V value,Node next){
            this.key=key;
            this.value=value;
            this.next=next;
       }

       public Node(K key){
          this(key,null,null);
       }

       public Node(){
           this(null,null,null);
       }

        @Override
        public String toString() {
            return key.toString()+":"+value.toString();
        }
    }

    private Node head;//头指针
    private int size;//size

    public LinkedListMap(){
           head=new Node();//初始化头结点
           size=0;//默认的长度为0
    }

    //根据key找到node
    private Node getNode(K key){
        Node tempNode=head.next;
        while(tempNode!=null){
          if(tempNode.key.equals(key)){
             return tempNode;
          }
          tempNode=tempNode.next;
        }
        return  null;
    }



    //加入值
    @Override
    public void add(K key, V value) {
        Node node = getNode(key);
        if(null==node){
            head.next=new Node(key,value,head.next);
            size++;
        }else{
            node.value=value;
        }
    }

    //根据键删除值
    @Override
    public V remove(K key) {
         Node preNode = head;
         while(preNode.next!=null){
             if(preNode.next.key.equals(key)){//找到了
                break;
             }
             preNode=preNode.next;
         }
         if(preNode.next!=null){
                Node delNode=preNode.next;
                preNode.next=delNode.next;
                delNode.next=null;
                size--;
                return delNode.value;
         }else{
             throw  new IllegalArgumentException("删除失败,key不存在");
         }
    }


    //是否包含某个键
    @Override
    public boolean contains(K key) {
        return getNode(key)!=null;
    }

    //获取值
    @Override
    public V get(K key) {
        Node node = getNode(key);
        return node==null?null:node.value;
    }

    //设置值
    @Override
    public void set(K key, V newValue) {
        Node node = getNode(key);
        if (null!=node) {
            node.value=newValue;
        }else {
            throw  new IllegalArgumentException(key+" doesn't exist");
        }
    }

    //获取值
    @Override
    public int getSize() {
        return size;
    }

    //判断是否为空
    @Override
    public boolean isEmpty() {
        return size==0;
    }

     //简单的toString
    @Override
    public String toString() {
        StringBuilder stringBuilder=new StringBuilder();
        stringBuilder.append("LinkedListMap:");
        Node tempNode=head.next;
        while(tempNode!=null){
          stringBuilder.append("[key:"+tempNode.key+" value:"+tempNode.value+"],");
          tempNode=tempNode.next;
        }
        return stringBuilder.toString();
    }
}

 测试类:Main

public class Main  {
    public static void main(String[] args) {
        LinkedListMap map=new LinkedListMap();
        map.add("1","1");
        map.add("2","2");
        map.add("3","3");
        map.add("4","4");
        System.err.println("key:2  value:"+map.get("2"));
        System.err.println("size: "+map.getSize());
        map.remove("2");
        System.err.println(map);

    }
}

测试结果:

 

有兴趣的伙伴可以自行测试代码,提升自我,大家加油!!!

你可能感兴趣的:(数据结构与算法)