zoukankan      html  css  js  c++  java
  • 2019-05-27 Java学习日记之Map集合&模拟斗地主洗牌发牌

    Map集合

    Map集合的概述和特点:

    A:概述

    将键映射到值的对象

    一个映射不能包含重复的键

    每个 键最多只能映射到一个值

    B:Map接口和Collection接口的不同

    Map是双列的,Collection是单列的

    Map的键唯一,Collection的子体系Set是唯一的

    Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

    Map集合的功能概述:

    a:添加功能

      V put(K key,V value):添加元素

        如果键是第一次存储,就直接存储元素,返回null

        如果键不是第一次存储,就用值把以前的值替换掉,返回以前的值

    b:删除功能

    void clear():移除所有的键值对元素

    V remove(Object key):根据键删除键值对元素,并把值返回

    c:判断功能

    boolean containsKey(Object key):判断集合是否包含指定的键

    boolean containsValue(Object value):判断集合是否包含指定的值

    boolean isEmpty():判断集合是否为空

    d:获取功能

    Set<Map.Entry<K,V>> entrySet():

    V get(Object key):根据键获取值

    Set<K> keySet():获取集合中所有键的集合

    Collection<V> values():获取集合中所有值得集合

    e:长度功能

    int size():返回集合中的键值对的个数

    Demo:

    package com.map;
    
    import java.util.Collection;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Demo1 {
    
        public static void main(String[] args) {
    //        demo1();
    //        demo2();
            Map<String, Integer> map = new HashMap<>();
            map.put("张三", 23);
            map.put("李四", 24);
            map.put("王五", 25);
            map.put("赵六", 26);
            
            Collection<Integer> c = map.values();
            System.out.println(c);
            System.out.println(map.size());
        }
    
        public static void demo2() {
            Map<String, Integer> map = new HashMap<>();
            map.put("张三", 23);
            map.put("李四", 24);
            map.put("王五", 25);
            map.put("赵六", 26);
            
            //Integer value = map.remove("张三");                //根据键删除元素,返回键对应的值
            //System.out.println(value);
            System.out.println(map.containsKey("张三"));        //判断是否包含传入的键
            System.out.println(map.containsValue(100));        //判断是否包含传入的
            System.out.println(map);
        }
    
        public static void demo1() {
            Map<String, Integer> map = new HashMap<>();
            Integer i1 = map.put("张三", 23);
            Integer i2 = map.put("李四", 24);
            Integer i3 = map.put("王五", 25);
            Integer i4 = map.put("赵六", 26);
            Integer i5 = map.put("张三", 26);            //相同的键不存储,值覆盖,吧覆盖的值返回
            
            System.out.println(map);
            
            System.out.println(i1);
            System.out.println(i2);
            System.out.println(i3);
            System.out.println(i4);
            System.out.println(i5);
        }
    
    }

    Map集合的遍历之键找值:

    A:键找值思路

    获取所有键的集合

    遍历键的集合,获取到每一个键

    根据键找值

    B:Demo

    package com.map;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class Demo2 {
    
        public static void main(String[] args) {
            Map<String, Integer> map = new HashMap<>();
            map.put("张三", 23);
            map.put("李四", 24);
            map.put("王五", 25);
            map.put("赵六", 26);
            
            //Integer i = map.get("张三");        //根据键获取值
            //System.out.println(i);
            
            //获取所有的键
            /*Set<String> keySet = map.keySet();    //获取所有键的集合
            Iterator<String> it = keySet.iterator();    //获取迭代器
            while (it.hasNext()) {                //判断集合中是否有元素
                String key = it.next();            //获取每一个键
                Integer value = map.get(key);    //根据键获取值
                System.out.println(key + "=" +value);
            }*/
            
            //使用增强for循环遍历
            for (String key : map.keySet()) {        //map.keySet()是所有键的集合
                System.out.println(key + "=" + map.get(key));
            }
        }
    
    }

     Map集合的遍历值键值对对象找键和值:

    A:键值对对象找键和值思路

    获取所有键值对对象的集合

    遍历键值对对象的集合,获取到每一个键值对对象

    根据键值对对象找键和值

    B:Demo

    package com.map;
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    public class Demo3 {
        /**
         * Map集合的第二种迭代,根据键值对对象,获取键和值
         */
        public static void main(String[] args) {
            Map<String, Integer> map = new HashMap<>();
            map.put("张三", 23);
            map.put("李四", 24);
            map.put("王五", 25);
            map.put("赵六", 26);
    
            // Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象,并存储在Set中
            Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
            //获取每一个对象
            /*Iterator<Map.Entry<String, Integer>> it = entrySet.iterator();
            while (it.hasNext()) {
                //获取每一个Entry对象
                Map.Entry<String, Integer> en = it.next();
                String key = en.getKey();                    //根据键值对对象获取键
                Integer value = en.getValue();                //根据键值对对象获取值
                System.out.println(key + "=" + value);
            }*/
            
            for (Map.Entry<String, Integer> en : entrySet) {
                System.out.println(en.getKey() + "=" + en.getValue());
            }
            
        }
    }

    HashMap集合键是Student值是String的案例:

    package com.map;
    
    import java.util.HashMap;
    
    import com.bean.Student;
    
    public class Demo4 {
        /**
         * HashMap集合键是Student值是String的案例:
         * 键是学生对象,代表每一个学生
         * 值是字符串对象,代表学生归属地
         */
        public static void main(String[] args) {
            HashMap<Student,String> hm = new HashMap<>();
            hm.put(new Student("张三",23),"北京" );
            hm.put(new Student("李四",23),"上海" );
            hm.put(new Student("王五",25),"广州" );
            hm.put(new Student("赵六",26),"深圳" );
            
            System.out.println(hm);
        }
    
    }

    LinkedHashMap的概述和使用:

    特点:

    底层是链表实现的可以保证怎么存就怎么取

    package com.map;
    
    import java.util.LinkedHashMap;
    
    public class Demo5 {
    
        public static void main(String[] args) {
            LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();
            lhm.put("张三", 23);
            lhm.put("李四", 24);
            lhm.put("王五", 25);
            lhm.put("赵六", 26);
            
            System.out.println(lhm);
        }
    
    }

    TreeMap集合键是Student值是String的案例:

    package com.map;
    
    import java.util.Comparator;
    import java.util.TreeMap;
    
    import com.bean.Student;
    
    public class Demo6 {
    
        public static void main(String[] args) {
            TreeMap<Student, String> tm = new TreeMap<>(new Comparator<Student>() {
    
                @Override
                public int compare(Student s1, Student s2) {
                    int num = s1.getName().compareTo(s2.getName());        //按照姓名排序
                    return num == 0 ? s1.getAge() - s2.getAge() : num;
                }
            });
            tm.put(new Student("张三",23),"北京" );
            tm.put(new Student("王五",35),"广州" );
            tm.put(new Student("李四",13),"上海" );
            tm.put(new Student("赵六",46),"深圳" );
            
            System.out.println(tm);
        }
    
    }

    统计字符串中每个字符出现的次数:

    package com.test;
    
    import java.util.HashMap;
    
    public class Test1 {
        /**
         * 需求:统计字符串中每个字符出现的次数
         * 分析:
         * 1、定义一个需要被统计字符的字符串
         * 2、将字符串转换为字符数组
         * 3、定义双列集合,存储字符串中字符一级字符出现的次数
         * 4、遍历字符数组获取每一个字符,并将字符存储在双列集合中
         * 5、存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
         * 6、打印双列集合获取字符出现的次数
         */
        public static void main(String[] args) {
            //1、定义一个需要被统计字符的字符串
            String s = "aaaaaabbbbbcccccccc";
            //2、将字符串转换为字符数组
            char[] arr = s.toCharArray();
            //3、定义双列集合,存储字符串中字符一级字符出现的次数
            HashMap<Character, Integer> hm = new HashMap<>();
            //4、遍历字符数组获取每一个字符,并将字符存储在双列集合中
            for (char c : arr) {
                //5、存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储
                /*if (!hm.containsKey(c)) {    //如果不包含这个键
                    hm.put(c, 1);
                }else {
                    hm.put(c, hm.get(c) + 1);
                }*/
                hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);
            }
            //6、打印双列集合获取字符出现的次数
            for (Character key : hm.keySet()) {                //hm.keySet()代表所有键的集合
                System.out.println(key + "=" + hm.get(key));//hm.get(key)根据键获取值
            }
        }
    
    }

    HashMap和Hashtable的区别:

    A:面试题

    区别:

    Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高

    Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

    B:Demo

    package com.map;
    
    import java.util.HashMap;
    import java.util.Hashtable;
    
    public class Demo7 {
        public static void main(String[] args) {
            
            HashMap<String, Integer> hm = new HashMap<>();
            hm.put(null, 23);
            hm.put("张三", null);
            System.out.println(hm);
            
            Hashtable<String, Integer> ht = new Hashtable<>();
            ht.put(null, 23);
            ht.put("张三", null);
            System.out.println(ht);
        }
    }

        Collection工具类的概述和常见方法:

    A:概述

    针对集合操作的工具类

    B:成员方法

    public static <T> void sort(List<T> list)

    public static <T> int binarySearch(List<?> list,T key)

    public static <T> T max(Collection<?> coll)  

    public static void reverse(List<?> list)

    public static void shuffle(List<?> list)

    C:Demo

    package com.collection;
    
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class Demo1 {
    
        public static void main(String[] args) {
    //        demo1();
    //        demo2();
            ArrayList<String> list = new ArrayList<>();
            list.add("a");
            list.add("c");
            list.add("h");
            list.add("f");
            list.add("g");
            System.out.println(Collections.max(list));        //根据默认排序结果获取集合中的最大值
    //        Collections.reverse(list);                        //反转集合
            Collections.shuffle(list);                        //随机置换,可以用来洗牌    
            System.out.println(list);                         
        }
    
        public static void demo2() {
            ArrayList<String> list = new ArrayList<>();
            list.add("a");
            list.add("c");
            list.add("d");
            list.add("f");
            list.add("g");
            
            System.out.println(Collections.binarySearch(list, "c"));
            System.out.println(Collections.binarySearch(list, "b"));
        }
    
        public static void demo1() {
            ArrayList<String> list = new ArrayList<>();
            list.add("c");
            list.add("d");
            list.add("a");
            list.add("c");
            list.add("b");
            list.add("c");
            
            System.out.println(list);
            Collections.sort(list);     //将集合排序
            System.out.println(list);
        }
    
    }

    模拟斗地主洗牌和发牌

    模拟斗地主洗牌和发牌,牌没有排序:

    package com.test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    
    public class Test2 {
        /**
         * 模拟斗地主洗牌和发牌,牌没有排序
         * 
         * 分析:
         * 1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
         * 2、洗牌
         * 3、发牌
         * 4、看牌
         */
        public static void main(String[] args) {
            //1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
            String[] num = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
            String[] color = {"红桃","黑桃","方块","梅花"};
            ArrayList<String> poker = new ArrayList<>();
            
            //拼接花色和数字
            for (String s1 : color) {
                for (String s2 : num) {
                    poker.add(s1.concat(s2));         //concat连接两个字符串
                }
            }
            poker.add("小王");
            poker.add("大王");
            //2、洗牌
            Collections.shuffle(poker);
            //3、发牌
            ArrayList<String> tan = new ArrayList<>();
            ArrayList<String> zhou = new ArrayList<>();
            ArrayList<String> chen = new ArrayList<>();
            ArrayList<String> dipai = new ArrayList<>();
            
            for (int i = 0; i < poker.size(); i++) {
                if (i >= poker.size() - 3) {
                    dipai.add(poker.get(i));         //将三张底牌存储在底牌集合中
                }else if (i % 3 == 0) {
                    tan.add(poker.get(i));
                }else if (i % 3 == 1) {
                    zhou.add(poker.get(i));
                }else {
                    chen.add(poker.get(i));
                }
            }
            //4、看牌
            System.out.println(tan);
            System.out.println(zhou);
            System.out.println(chen);
            System.out.println(dipai);
        }
    
    }

    模拟斗地主洗牌和发牌并对牌进行排序:

    package com.test;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.TreeSet;
    
    public class Test3 {
        /**
         * 模拟斗地主洗牌和发牌,牌没有排序
         * 
         * 分析:
         * 1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
         * 2、洗牌
         * 3、发牌
         * 4、看牌
         */
        public static void main(String[] args) {
            //1、买一副扑克,自己创建一个集合对象,将扑克牌存储进去
            String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
            String[] color = {"方块","梅花","红桃","黑桃"};
            HashMap<Integer, String> hm = new HashMap<>();            //存储索引和扑克牌
            ArrayList<Integer> list = new ArrayList<>();            //存储索引
            int index = 0;
            
            //拼接扑克牌并索引和扑克牌存储在hm中
            for (String s1 : num) {                                    //获取数字    
                for (String s2 : color) {                            //获取颜色
                    hm.put(index, s2.concat(s1));
                    list.add(index);    
                    index++;            
                }
            }
            //将小王添加到双列集合中
            hm.put(index, "小王");
            list.add(index);                                        //将52索引添加到集合中
            index++;
            hm.put(index, "大王");
            list.add(index);                                        //将53索引添加到集合中
            
            //2、洗牌
            Collections.shuffle(list);
            //3、发牌
            TreeSet<Integer> tan = new TreeSet<>();
            TreeSet<Integer> zhou = new TreeSet<>();
            TreeSet<Integer> chen = new TreeSet<>();
            TreeSet<Integer> dipai = new TreeSet<>();
            
            for (int i = 0; i < list.size(); i++) {
                if (i >= list.size() - 3) {
                    dipai.add(list.get(i));         //将三张底牌存储在底牌集合中
                }else if (i % 3 == 0) {
                    tan.add(list.get(i));
                }else if (i % 3 == 1) {
                    zhou.add(list.get(i));
                }else {
                    chen.add(list.get(i));
                }
            }
            //4、看牌
            lookPoker(hm, tan, "谭");
            lookPoker(hm, zhou, "周");
            lookPoker(hm, chen, "陈");
            lookPoker(hm, dipai, "底牌");
            
        }
        /**
         * 看牌
         * 分析:
         * 1、返回值类型void
         * 2、参数列表HashMap,TreeSet,String name
         */
        public static void lookPoker(HashMap<Integer, String> hm,TreeSet<Integer> ts , String name){
            System.out.print(name + "的牌是:");
            for (Integer i : ts) {        //i代表双列集合中的每一个键
                System.out.print(hm.get(i) + " ");
            }
            System.out.println();
        }
    }

    泛型固定下边界:

    package com.collection;
    
    import java.util.ArrayList;
    import java.util.Comparator;
    import java.util.TreeSet;
    
    import com.bean.BaseStudent;
    import com.bean.Student;
    
    public class Demo2 {
        /**
         * 泛型固定下边界
         * ? super E
         * 
         * 泛型固定上边界
         * ? extends E
         */
        public static void main(String[] args) {
    //        demo1();
            TreeSet<Student> ts1 = new TreeSet<>(new CompareByAge());
            ts1.add(new Student("张三",32));
            ts1.add(new Student("李四",12));
            ts1.add(new Student("王五",42));
            ts1.add(new Student("赵六",22));
            
            TreeSet<BaseStudent> ts2 = new TreeSet<>(new CompareByAge());
            ts2.add(new BaseStudent("张三",32));
            ts2.add(new BaseStudent("李四",12));
            ts2.add(new BaseStudent("王五",42));
            ts2.add(new BaseStudent("赵六",22));
            
            System.out.println(ts2);
        }
    
        public static void demo1() {
            ArrayList<Student> list1 = new ArrayList<>();
            list1.add(new Student("张三",23));
            list1.add(new Student("李四",24));
        
            ArrayList<BaseStudent> list2 = new ArrayList<>();
            list2.add(new BaseStudent("王五",25));
            list2.add(new BaseStudent("赵六",26));
            
            list1.addAll(list2);
        }
    
    }
    class CompareByAge implements Comparator<Student> {
    
        @Override
        public int compare(Student s1, Student s2) {
            int num = s1.getAge() - s2.getAge();
            return num == 0 ? s1.getName().compareTo(s2.getName()) : num;
        }
        
    }

    Student.java

    package com.bean;
    
    import javax.swing.plaf.nimbus.NimbusLookAndFeel;
    
    public class Student implements Comparable<Student> {
        private String name;
        private int age;
    
        public Student() {
            super();
        }
    
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + "]";
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + age;
            result = prime * result + ((name == null) ? 0 : name.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Student other = (Student) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    
        @Override
        public int compareTo(Student o) {
            int num = this.age - o.age;
            return num == 0 ? this.name.compareTo(o.name) : num;
        }
        
    }

    BaseStudent.java

    package com.bean;
    
    public class BaseStudent extends Student {
    
        public BaseStudent() {
        }
    
        public BaseStudent(String name, int age) {
            super(name, age);
        }
    
    }

     

  • 相关阅读:
    python学习笔记(一)--之list与tuple
    centos 安装redis3.0为解决数据库频繁插入数据IO性能问题
    Win32汇编木马初探
    Knockout自定义绑定my97datepicker
    iTextSharp给PDF添加水印
    技术资料整理
    css模拟阴影和小三角
    统计一个部门有多少人
    js登录界面带提示
    程序员给女朋友用HTML5制作的3D相册 (www.webhek.com)<转摘>
  • 原文地址:https://www.cnblogs.com/clqbolg/p/10934911.html
Copyright © 2011-2022 走看看