集合和映射

91 篇文章 1 订阅
59 篇文章 0 订阅

集合和映射

集合

  • 和数学里面定义一样:无序,不重复

  • 里面的具体的包装类BST:二分搜索树和链表之前已经发过

    package 数据结构.set;
    
    import 数据结构.BST.BST;
    //使用二分搜索树来进行集合表达
    public class BSTSet<E extends Comparable<E>> implements Set<E> {
        private BST<E> bst;
        public BSTSet(){
            bst=new BST<>();
        }
    
        @Override
        public int getSize() {
            return bst.getSize();
        }
    
        @Override
        public boolean isEmpty() {
            return bst.isEmpty();
        }
    
        @Override
        public void add(E e) {
            bst.add(e);
        }
    
        @Override
        public boolean contains(E e) {
            return  bst.contains(e);
        }
    
        @Override
        public void remove(E e) {
            bst.remove(e);
        }
    }
    package 数据结构.set;
    
    import 数据结构.LinkedList.LinkedList;
    
    import java.util.ArrayList;
    //使用链表进行表示集合
    public class LinkedListSet<E> implements Set<E> {
        private LinkedList<E> list;
        public LinkedListSet(){
            list = new LinkedList<>();
        }
    
        @Override
        public int getSize() {
            return list.getSize();
        }
        public boolean isEmpty(){
            return list.isEmpty();
        }
    
        @Override
        public boolean contains(E e) {
            return  list.contains(e);
        }
    
        @Override
        public void add(E e) {
            if(!list.contains(e))
                list.addFirst(e);
        }
    
        @Override
        public void remove(E e) {
            list.removeElement(e);
        }
        public static void main(String[] args) {
            System.out.println("Pride and Prejudice");
            ArrayList<String> words1 = new ArrayList<>();
            FileOperation.readFile("C:\\Users\\admin\\IdeaProjects\\untitled1\\src\\数据结构\\set\\pride-and-prejudice.txt",words1);
            LinkedListSet<String> set1 = new LinkedListSet<>();
            for (String word:words1) {
                set1.add(word);
            }
            System.out.println(set1.getSize());
            System.out.println(words1.size());
        }
    }
    
    
  • 通过复杂度分析:我们可以明显知道,以二叉树来表示集合,速度更快,而使用链表时间复杂度高的多

映射(map)

  • 俗称:字典或者键值对

  • 也有两种处理方式:链表映射和二叉树映射

  • 链表映射:

    package 数据结构.map;
    
    import 数据结构.LinkedList.LinkedList;
    
    import java.security.Key;
    import java.util.ArrayList;
    import java.util.Set;
    import java.util.function.ToDoubleBiFunction;
    
    public class LinkedListMap<K,V>implements Map<K,V> {
        public 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 dummyHead;
        private int size;
        public LinkedListMap(){
            dummyHead = new Node();
            size=0;
        }
    
        @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;
        }
    
        @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 add(K key, V value) {
            Node node = getNode(key);
            if(node==null){
                dummyHead.next = new Node(key,value,dummyHead.next);
                size++;
            }
            else {
                node.value = value;
            }
        }
    
        @Override
        public void set(K key, V newValue) {
            Node node = getNode(key);
            if(node==null)
                throw new IllegalArgumentException(key+"doesn't exist!");
            node.value = newValue;
        }
    
        @Override
        public V remove(K key) {
            Node prev = dummyHead;
            while (prev.next!=null)
            {
                if(prev.next.key.equals(key))
                    break;
                prev = prev.next;
            }
            if(prev.next!=null){
                Node delNode = prev.next;
                prev.next = delNode.next;
                delNode.next = null;
                size--;
                return delNode.value;
            }
            return null;
        }
    
        public static void main(String[] args) {
            System.out.println("Pride and Prejudice");
            ArrayList<String> words = new ArrayList<>();
            if(FileOperation.readFile("C:\\Users\\admin\\IdeaProjects\\untitled1\\src\\数据结构\\map\\pride-and-prejudice.txt",words))
            {
                System.out.println("Total words: "+words.size());
                LinkedListMap<String,Integer> map = new LinkedListMap<>();
                for (String word:words)
                {
                    if (map.contains(word))
                    {
                        map.set(word,map.get(word)+1);
                    }
                    else{
                        map.add(word,1);
                    }
                }
                System.out.println(map.getSize());
            }
    
        }
    }
    
    
  • 二分搜索树映射

    package 数据结构.map;
    
    import java.nio.channels.ClosedSelectorException;
    import java.security.PublicKey;
    import java.util.ArrayList;
    
    public class BSTMap<K extends Comparable<K>,V>implements Map<K,V> {
        private class Node{
            public K key;
            public V value;
            public Node left,right;
            public Node(K key,V value){
                this.key = key;
                this.value = value;
                left = null;
                right=null;
            }
        }
        private  Node root;
        private  int size;
        public BSTMap(){
            root = null;
            size = 0;
        }
    
        @Override
        public int getSize() {
            return size;
        }
    
        @Override
        public boolean isEmpty() {
            return size==0;
        }
    //向二分搜索树中添加新的元素
        @Override
        public void add(K key, V value) {
            root = add(root,key,value);
        }
    
        //向以node为根的二分搜索树中插入元素,使用递归算法
        //返回插入新节点后的二分搜索树的根
        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.left = add(node.left,key,value);
            }
            else if (key.compareTo(node.key)>0)
            {
                node.right  = add(node.right,key,value);
            }
            else{
                node.value = value;
            }
            return node;
        }
        //返回以node为根节点的二分搜索树中,key所在的节点
        private Node getNode(Node node,K key){
            if(node==null)
                return null;
            if(key.compareTo(node.key)==0)
                return node;
            else if(key.compareTo(node.key)<0)
                return getNode(node.left,key);
            else
                return getNode(node.right,key);
        }
    
        @Override
        public boolean contains(K key) {
            return getNode(root,key)!=null;
        }
    
        @Override
        public V get(K key) {
            Node node = getNode(root,key);
            return node ==null?null:node.value;
        }
    
        @Override
        public void set(K key, V newValue) {
            Node node = getNode(root,key);
            if(node.left == null)
                throw  new IllegalArgumentException(key+"doesn't exist!");
            node.value = newValue;
        }
        //返回以node为根的二分搜索树的最小值所在节点
        private Node minimum(Node node){
            if(node.left == null)
                return node;
            return minimum(node.left);
        }
        //删除最小节点
        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 V remove(K key) {
            Node node = getNode(root,key);
            if(node!=null)
            {
                root = remove(root,key);
                return node.value;
            }
            return null;
        }
        //删除掉某一结点
        //返回删除节点后新的二分搜索树的根
        private  Node remove(Node node,K key) {
            if (node == null)
                return null;
            if (key.compareTo(node.key) < 0) {
                node.left = remove(node.left, key);
                return node;
            } else if (key.compareTo(node.key) > 0) {
                node.right = remove(node.right, key);
                return node;
            } else {//k==node.e
                //待删除节点左子树为空
                if (node.left == null) {
                    Node rightNode = node.right;
                    node.right = null;
                    size--;
                    return rightNode;
                }
                //待删除节点右子树为空
                if (node.right == null) {
                    Node leftNode = node.left;
                    node.left = null;
                    size--;
                    return leftNode;
                }
                //待删除节点左右子树均不为空的情况
                //找到比待删除节点大的最小节点,即待删除节点右子树的最小节点
                //用这个节点替换待删除节点的位置
                Node successor = minimum(node.right);
                successor.right = removeMin(node.right);
                successor.left = node.left;
                node.left = node.right = null;
                return successor;
            }
            }
            public static void main(String[] args) {
                System.out.println("Pride and Prejudice");
                ArrayList<String> words = new ArrayList<>();
                if(FileOperation.readFile("C:\\Users\\admin\\IdeaProjects\\untitled1\\src\\数据结构\\map\\pride-and-prejudice.txt",words))
                {
                    System.out.println("Total words: "+words.size());
                    BSTMap<String,Integer> map = new BSTMap<>();
                    for (String word:words)
                    {
                        if (map.contains(word))
                        {
                            map.set(word,map.get(word)+1);
                        }
                        else{
                            map.add(word,1);
                        }
                    }
                    System.out.println(map.getSize());
                }
    
            }
        }
    
    
  • 集合和映射,使用原理大概一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值