映射Map

映射Map在这里插入图片描述
存储(键,值) 数据对的数据结构(key,value)
根据键(Key),寻找值(Value)
非常容易使用链表或者二分搜索树实现

//二分搜索树
class Node{
	E e;
	Node left;
	Noder right;
}
//链表
class Node{
	E e;
	Node next;
}

基于Map

//二分搜索树
class Node{
	K key;
	V value;
	Node left;
	Noder right;
}
//链表
class Node{
	K key;
	V value;
	Node next;
}

映射接口

Map<K,V>
	void add(K,V)
	V remove(K)//删除Key对应的键值 返回被删除值
	boolean contains(K)
	V get(K)//传入某个键 返回值
	void set(K,V)//修改操作 给定一个键 修改对应值
	int getSize()
	boolean isEmpty()

基于链表的 映射Map

public class LinkedListMap<K,V> implements Map<K,V> {
    private class Node{
        public K key;
        public V value;
        public Node next;
        public Node (K key ,V value,Node next){
            this.key = key;
            this.next =next;
            this.value = value;

        }
        public Node (K key){this(key,null,null);}
        public Node (){this(null,null,null);}
        @Override
        public String toString(){
            return this.key.toString()+":"+this.value.toString();
        }
    }


    private Node dummyHead;
    private int size;

    public LinkedListMap(){
        dummyHead = new Node();
        size = 0;

    }
    @Override
    public void add(K key, V value) {
        Node cur = getNode(key);
        if(cur==null){
            dummyHead.next = new Node(key,value,dummyHead.next);
            size++;
        }
        else{
            cur.value = value;
        }

    }

    @Override
    public V remove(K key) {
        Node cur =dummyHead.next;
        for(int i =0;i<size;i++){
            if(cur.next.key.equals(key)){
                cur.next = cur.next.next;
                Node reval = cur.next;
                reval.next =null;
                size--;
                return reval.value;
            }
            cur=cur.next;
        }
        return null;
    }

    @Override
    public boolean contains(K k) {
        return getNode(k)!=null;
    }

    @Override
    public V get(K k) {
        Node node =getNode(k);
        return node == null ? null : node.value;
    }

    @Override
    public void set(K k, V v) {
        Node node =getNode(k);
        if(node == null){
            throw new IllegalArgumentException(k + "is not exist");
        }
        node.value = v;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }
    private Node getNode(K key){
        Node cur =dummyHead.next;
        while(cur != null){
            if(cur.key.equals(key))
                return cur;
            cur =cur.next;
        }
        return null;
    }

}

基于二分搜索树

public class BSTMap<K extends Comparable<K>,V> implements Map<K,V> {
    private class Node{
        public K key;
        public V value;
        public Node left;
        public Node right;
        public Node (K key ,V value,Node left,Node right){
            this.key = key;
            this.value = value;
            this.left = left;
            this.right = right;

        }
        public Node (K key){this(key,null,null,null);}
        public Node (K key,V value){this(key,value,null,null);}
        public Node (){this(null,null,null,null);}
        @Override
        public String toString(){
            return this.key.toString()+":"+this.value.toString();
        }
    }
    private Node root;
    private int size;
    public BSTMap(){
        root = null;
        size = 0;
    }
    @Override
    public void add(K key, V value) {
        root = add(root,key,value);

    }
    //向二分搜索树添加
    private  Node add(Node node,K key,V value){
        if( node==null){
            size ++;
            return new Node(key,value);
        }
        if(key.compareTo(node.key) > 0)
            node.right = add(node.right,key,value);
        else if(key.compareTo(node.key)<0)
            node.left = add(node.left,key,value);
        else
            node.value = value;
        return node;
    }

    @Override
    public V remove(K key) {
        return remove(root,key).value;
    }
    private Node remove(Node node ,K k){
        if(node ==null)
            return null;
        if(k.compareTo(node.key)>0){
            node.right = remove(node.right,k);
            return node;}
        if(k.compareTo(node.key)<0){
            node.left = remove(node.left,k);
            return node;}
        else{
            if(node.left ==null){
                Node rightNode =node.right;
                node.right =null;
                size --;
                return  rightNode;
            }
            if(node.right == null){
                Node leftNode =node.left;
                node.right =null;
                size --;
                return  leftNode;
            }
            Node successor = minimum(node.right);
            successor.right = removeMinimum(node.right);
            successor.left =node.left;
            node.left =node.right =null;
            return successor;
        }

    }

    public V minimum(){
        if(size == 0)
            throw  new IllegalArgumentException("BST is empty");
        return minimum(root).value;
    }

    private Node minimum(Node node) {

        if (node.left == null)
            return node;
        return minimum(node.left);

    }

    private Node removeMinimum(Node node) {
       if(node == null)
           return null;
       node.left = removeMinimum(node.left);
       return node;
    }

    private Node removeMin(Node node) {

        if(node.left == null){
            Node rightNode = node.right;
            node.right =null;
            size --;
            return rightNode;

        }
        node.left = removeMin(node.left);
        return node;


    }

    @Override
    public boolean contains(K k) {
        Node node =getNode(root,k);
        return node!=null;
    }

    @Override
    public V get(K k) {
        Node node = getNode(root,k);
        return node ==null? null:node.value;
    }
    private Node getNode(Node node,K key) {
        if (node == null)
            return null;

        if (key.compareTo(node.key) < 0)
            return getNode(node.left, key);
        else if(key.compareTo(node.key) > 0)
            return getNode(node.right, key);
        else
            return node;





    }

    @Override
    public void set(K k, V v) {
    Node node =getNode(root,k);
    if(node == null)
        throw  new IllegalArgumentException(k + "doesn't exist");
    node.value = v;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }
}

posted @ 2019-12-15 14:24  caomaoboy  阅读(105)  评论(0)    收藏  举报