美文网首页我爱编程软件测试学习之路
Java学习笔记 16 - Map集合使用、遍历&&am

Java学习笔记 16 - Map集合使用、遍历&&am

作者: 乘风破浪的姐姐 | 来源:发表于2018-07-27 10:00 被阅读0次

    今日内容介绍
    1、Map集合
    2、Map集合遍历方式
    3、静态导入
    4、方法可变参
    5、模拟斗地主洗牌发牌

    01Map集合

    A:Map集合概述
    Map接口下的集合与Collection接口下的集合比较
    a:Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储。
    Collection中的集合称为单列集合,Map中的集合称为双列集合。
    b:Map中的集合,元素是成对存在的。每个元素由键与值两部分组成,通过键可以找对所对应的值。
    Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
    B:Map集合常用实现类
    HashMap
    LinkedHashMap

    C:Map接口中的常用方法
    1、 V remove(K) 移除集合中的键值对,返回被移除之前的值

        public static void function_2(){
            Map<Integer,String> map = new HashMap<Integer, String>();
            map.put(1, "a");
            map.put(2, "b");
            map.put(3, "c");
            System.out.println(map);
            
            String value = map.remove(33);
            System.out.println(value);
            System.out.println(map);
        }
    

    2、 V get(K) 通过键对象,获取值对象.如果集合中没有这个键,返回null

        public static void function_1(){
            //创建集合对象,作为键的对象整数,值的对象存储字符串
            Map<Integer,String> map = new HashMap<Integer, String>();
            map.put(1, "a");
            map.put(2, "b");
            map.put(3, "c");
            System.out.println(map);
            
            String value = map.get(4);
            System.out.println(value);
        }
    

    3、V put(K,V) 将键值对存储到集合中,(K作为键的对象,V作为值的对象)。存储的是重复的键,将原有的值,覆盖

        public static void function(){
            //创建集合对象,HashMap,存储对象,键是字符串,值是整数
            Map<String, Integer> map = new HashMap<String, Integer>();
            map.put("a", 1);
            map.put("b", 2);
            map.put("c", 3);
            
            System.out.println(map);
        }
    
    02集合遍历方式

    A:Map集合遍历方式keySet方法
    1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键
    2.遍历键的Set集合,得到每一个键
    3.根据键利用get(key)去Map找所对应的值

     public class MapDemo1 {
        public static void main(String[] args) {
            /*
             *  1. 调用map集合的方法keySet,所有的键存储到Set集合中
             *  2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键)
             *  3. 调用map集合方法get,通过键获取到值
             */
            Map<String,Integer> map = new HashMap<String,Integer>();
            map.put("a", 11);
            map.put("b", 12);
            map.put("c", 13);
            map.put("d", 14);
            
            //1. 调用map集合的方法keySet,所有的键存储到Set集合中
            Set<String> set = map.keySet();
            //2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键)
            Iterator<String> it = set.iterator();
            while(it.hasNext()){
                //it.next返回是Set集合元素,也就是Map中的键
                //3. 调用map集合方法get,通过键获取到值
                String key = it.next();
                Integer value = map.get(key);
                System.out.println(key+"...."+value);
            }
            
            System.out.println("=======================");
            
    
            for(String key : map.keySet()){
                Integer value = map.get(key);
                System.out.println(key+"...."+value);
            }
        }
     }
    

    B:Map集合遍历方式entrySet方法
    entrySet方法,键值对映射关系(结婚证)获取
    实现步骤:
    1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合Set<Entry <K,V> >
    2. 迭代Set集合
    3. 获取出的Set集合的元素,是映射关系对象
    4. 通过映射关系对象方法 getKet, getValue获取键值对

    public class MapDemo2 {
        public static void main(String[] args) {
            Map<Integer,String> map = new HashMap<Integer, String>();
            map.put(1, "abc");
            map.put(2, "bcd");
            map.put(3, "cde");
            //1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合
            Set<Map.Entry <Integer,String> >  set = map.entrySet();
            //2. 迭代Set集合
            Iterator<Map.Entry <Integer,String> > it = set.iterator();
            while(it.hasNext()){
                //  3. 获取出的Set集合的元素,是映射关系对象
                // it.next 获取的是什么对象,也是Map.Entry对象
                Map.Entry<Integer, String> entry = it.next();
                //4. 通过映射关系对象方法 getKet, getValue获取键值对
                Integer key = entry.getKey();
                String value = entry.getValue();
                System.out.println(key+"...."+value);
            }
            
             
        }
    }
    

    C:Map集合遍历方式增强for循环
    Map集合获取方式:entrySet方法,键值对映射关系(结婚证)获取
    实现步骤:
    1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合Set<Entry <K,V> >
    2. 迭代Set集合
    3. 获取出的Set集合的元素,是映射关系对象
    4. 通过映射关系对象方法 getKet, getValue获取键值对
    Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以了。
    创建内部类对象 外部类.内部类 = new

      public class MapDemo2 {
        public static void main(String[] args) {
            Map<Integer,String> map = new HashMap<Integer, String>();
            map.put(1, "abc");
            map.put(2, "bcd");
            map.put(3, "cde");
            //1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合
            Set<Map.Entry <Integer,String> >  set = map.entrySet();
            //2. 迭代Set集合
            Iterator<Map.Entry <Integer,String> > it = set.iterator();
            while(it.hasNext()){
                //  3. 获取出的Set集合的元素,是映射关系对象
                // it.next 获取的是什么对象,也是Map.Entry对象
                Map.Entry<Integer, String> entry = it.next();
                //4. 通过映射关系对象方法 getKet, getValue获取键值对
                Integer key = entry.getKey();
                String value = entry.getValue();
                System.out.println(key+"...."+value);
            }
            
            System.out.println("=========================");
            for(Map.Entry<Integer, String> entry : map.entrySet()){
                System.out.println(entry.getKey()+"..."+entry.getValue());
            }
        }
      }
    

    D:Map集合Entry对象
    在Map类设计时,提供了一个嵌套接口:Entry。
    Entry将键值对的对应关系封装成了对象。
    即键值对对象,在遍历Map集合时,可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
    a:Entry是Map接口中提供的一个静态内部嵌套接口。
    b:相关方法
     getKey()方法:获取Entry对象中的键
     getValue()方法:获取Entry对象中的值
     entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

     interface Map{
        interface Entry{//Entry是Map的一个内部接口
                       //由Map的子类的内部类实现
    
        }
     }
     class HashMap{
        static class Entry<K,V> implements Map.Entry<K,V> {//Entry对象指的就是该类的对象
            final K key;
                  V value;
        }
     }
    

    E:使用HashMap集合,存储自定义的对象

     public class HashMapDemo {
        public static void main(String[] args) {
            function_1();
        }
        /*
         * HashMap 存储自定义对象Person,作为键出现
         * 键的对象,是Person类型,值是字符串
         * 保证键的唯一性,存储到键的对象,重写hashCode equals
         */
        public static void function_1(){
            HashMap<Person, String> map = new HashMap<Person, String>();
            map.put(new Person("a",20), "里约热内卢");
            map.put(new Person("b",18), "索马里");
            map.put(new Person("b",18), "索马里");
            map.put(new Person("c",19), "百慕大");
            for(Person key : map.keySet()){
                String value = map.get(key);
                System.out.println(key+"..."+value);
            }
            System.out.println("===================");
            for(Map.Entry<Person, String> entry : map.entrySet()){
                System.out.println(entry.getKey()+"..."+entry.getValue());
            }
        }
        
        /*
         * HashMap 存储自定义的对象Person,作为值出现
         * 键的对象,是字符串,可以保证唯一性
         */
        public static void function(){
            HashMap<String, Person> map = new HashMap<String, Person>();
            map.put("beijing", new Person("a",20));
            map.put("tianjin", new Person("b",18));
            map.put("shanghai", new Person("c",19));
            for(String key : map.keySet()){
                Person value = map.get(key);
                System.out.println(key+"..."+value);
            }
            System.out.println("=================");
            for(Map.Entry<String, Person> entry : map.entrySet()){
                String key = entry.getKey();
                Person value = entry.getValue();
                System.out.println(key+"..."+value);
            }
        }
     }
    
    03 LinkedHashMap的特点

    LinkedHashMap继承HashMap,保证迭代的顺序

      public class LinkedHashMapDemo {
        public static void main(String[] args) {
            LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();
            link.put("1", "a");
            link.put("13", "a");
            link.put("15", "a");
            link.put("17", "a");
            System.out.println(link);
        }
      }
    
    04 Hashtable的特点

    Map接口实现类 Hashtable.底层数据结果哈希表,特点和HashMap是一样的
    Hashtable、HashMap比较
    Hashtable 线程安全集合,运行速度慢
    Hashtable命运和Vector是一样的,从JDK1.2开始,被更先进的HashMap取代
    Hashtable 不允许存储null值,null键
    Hashtable的子类 Properties 依然活跃在开发舞台
    HashMap 线程不安全的集合,运行速度快
    HashMap 允许存储null值,null键

       public class HashtableDemo {
        public static void main(String[] args) {    
            Map<String,String> map = new Hashtable<String,String>();
            map.put(null, null);
            System.out.println(map);
        }
       }
    
    05 静态导入

    静态导入特点:
    如果本类中有和静态导入的同名方法会优先使用本类的
    如果还想使用静态导入的,依然需要类名来调用
    JDK1.5的新特性,可以减少开发的代码量
    如:import static java.lang.System.out;最末尾,必须是一个静态成员

       import static java.lang.System.out;
       import static java.util.Arrays.sort;
    
       public class StaticImportDemo {
        public static void main(String[] args) {
            out.println("hello");
            
            int[] arr = {1,4,2};
            sort(arr);
        }
       }
    
    06方法的可变参数

    A:方法的可变参数使用
    JDK1.5新的特性,即方法参数数据类型确定,参数的个数任意
    可变参数语法: 数据类型...变量名。本质就是一个数组

    public class VarArgumentsDemo {
        public static void main(String[] args) {
            //调用一个带有可变参数的方法,传递参数,可以任意
        //  getSum();
            int sum = getSum(5,34,3,56,7,8,0);
            System.out.println(sum);
        }
     
        /*
         * 定义方法,计算10个整数和
         * 方法的可变参数实现
         */
        public static int getSum(int...a){
            int sum = 0 ;
            for(int i : a){
                sum = sum + i;
            }
            return sum;
        }
        
        /*
         * 定义方法,计算3个整数和
         */
        /*public static int getSum(int a,int b ,int c){
            return a+b+c;
        }*/
        
        /*
         * 定义方法,计算2个整数和
         */
        /*public static int getSum(int a,int b){
            return a+b;
        }*/
     }
    

    B:可变参数的注意事项
    1. 一个方法中,可变参数只能有一个
    2. 可变参数,必须写在参数列表的最后一位

    public static void function(Object...o){
     
    }
    

    07 Collections工具类

    A:Collections.shuffle() 对List集合中的元素,进行随机排列

        public static void function_2(){
            List<Integer> list = new ArrayList<Integer>();
            list.add(1);
            list.add(5);
            list.add(9);
            list.add(11);
            list.add(8);
            list.add(10);
            list.add(15);
            list.add(20);   
            System.out.println(list);
            
            //调用工具类方法shuffle对集合随机排列
            Collections.shuffle(list);
            System.out.println(list);
        }
    

    B:Collections.binarySearch()对List集合进行二分搜索,方法参数,传递List集合,传递被查找的元素

        public static void function_1(){
            List<Integer> list = new ArrayList<Integer>();
            list.add(1);
            list.add(5);
            list.add(8);
            list.add(10);
            list.add(15);
            list.add(20);
            //调用工具类静态方法binarySearch
            int index = Collections.binarySearch(list, 16);
            System.out.println(index);
        }
    

    C:Collections.sort静态方法,对于List集合,进行升序排列

        public static void function(){
            //创建List集合
            List<String> list = new ArrayList<String>();
            list.add("ewrew");
            list.add("qwesd");
            list.add("Qwesd");
            list.add("bv");
            list.add("wer");
            System.out.println(list);
            //调用集合工具类的方法sort
            Collections.sort(list);
            System.out.println(list);
        }
      }
    
    08斗地主的功能

    A:斗地主的功能分析
    a:具体规则:
    1. 组装54张扑克牌
    2. 将54张牌顺序打乱
    3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
    4. 查看三人各自手中的牌(按照牌的大小排序)、底牌
    b:分析:
    1.准备牌:
    完成数字与纸牌的映射关系:
    使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系(相当于一个字典)。
    2.洗牌:
    通过数字完成洗牌发牌
    3.发牌:
    将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。
    存放的过程中要求数字大小与斗地主规则的大小对应。
    将代表不同纸牌的数字分配给不同的玩家与底牌。
    4.看牌:
    通过Map集合找到对应字符展示。
    通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。

    B:斗地主的准备牌

     public class DouDiZhu {
        public static void main(String[] args) {
            //1. 组合牌
            //创建Map集合,键是编号,值是牌
            HashMap<Integer,String> pooker = new HashMap<Integer, String>();
            //创建List集合,存储编号
            ArrayList<Integer> pookerNumber = new ArrayList<Integer>();
            //定义出13个点数的数组
            String[] numbers = {"2","A","K","Q","J","10","9","8","7","6","5","4","3"};
            //定义4个花色数组
            String[] colors = {"♠","♥","♣","♦"};
            //定义整数变量,作为键出现
            int index = 2;
            //遍历数组,花色+点数的组合,存储到Map集合
            for(String number : numbers){
                for(String color : colors){
                    pooker.put(index, color+number);
                    pookerNumber.add(index);
                    index++;
                }
            }
            //存储大王,和小王,索引是从0~54,对应大王,小王,...3(牌的顺序从大到小)
            pooker.put(0, "大王");
            pookerNumber.add(0);
            pooker.put(1, "小王");
            pookerNumber.add(1);
         
     }
    

    C:斗地主的洗牌

        //洗牌,将牌的编号打乱
    Collections.shuffle(pookerNumber); 
    

    D:斗地主的发牌

            //发牌功能,将牌编号,发给玩家集合,底牌集合
            ArrayList<Integer> player1 = new ArrayList<Integer>();
            ArrayList<Integer> player2 = new ArrayList<Integer>();
            ArrayList<Integer> player3 = new ArrayList<Integer>();
            ArrayList<Integer> bottom = new ArrayList<Integer>();
            
            //发牌采用的是集合索引%3
            for(int i = 0 ; i < pookerNumber.size() ; i++){
                //先将底牌做好
                if(i < 3){
                    //存到底牌去
                    bottom.add( pookerNumber.get(i));
                   //对索引%3判断
                }else if(i % 3 == 0){
                    //索引上的编号,发给玩家1
                    player1.add( pookerNumber.get(i) );
                }else if( i % 3 == 1){
                    //索引上的编号,发给玩家2
                    player2.add( pookerNumber.get(i) );
                }else if( i % 3 == 2){
                    //索引上的编号,发给玩家3
                    player3.add( pookerNumber.get(i) );
                }
            }
              //对玩家手中的编号排序
            Collections.sort(player1);
            Collections.sort(player2);
            Collections.sort(player3);   
    

    E:斗地主的看牌

     //看牌,将玩家手中的编号,到Map集合中查找,根据键找值
     //定义方法实现
     look("刘德华",player1,pooker);
     look("张曼玉",player2,pooker);
     look("林青霞",player3,pooker);
     look("底牌",bottom,pooker);
    
     public static void look(String name,ArrayList<Integer> player,HashMap<Integer,String> pooker){
            //遍历ArrayList集合,获取元素,作为键,到集合Map中找值
            System.out.print(name+" ");
            for(Integer key : player){
                String value = pooker.get(key);
                System.out.print(value+" ");
            }
            System.out.println();
        }

    相关文章

      网友评论

        本文标题:Java学习笔记 16 - Map集合使用、遍历&&am

        本文链接:https://www.haomeiwen.com/subject/lwtimftx.html