A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-11-22 09:23 编辑

Map体系Map集合概述

java.util.Map<K, V>接口Map集合特点:    1. 是双列集合, 一个元素包含两个值 (键key, 值value)
    2. key和value的类型可以相同, 也可以不同
    3. key不允许重复, value可以重复
    4. key和value是一一对应的, 一个键只能对应一个值
//Map集合适合存储一对一关系的数据Map常用子类
java.util.Map<K, V>接口: 双列集合的根接口, 规定了共性的方法        |        |_ HashMap<K, V>类: 底层哈希表. key存取无序不可重复                |_ LinkedHashMap类: 底层哈希表+链表. key存取有序不可重复                映射: 键和值的对应关系 mapping
HashSet底层使用的就是HashMapLinkedHashSet底层使用的就是LinkedHashMap
Map中常用方法Map<String, Phone> map = new HashMap<>();

map.put("张三", p1);

map.put("张三", p2);
java.util.Map接口: 双列集合的顶层

        // 成员方法

        V put(K key, V value): 添加/修改键值对. 如果键存在, 则用新值替换已有值

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

        V get(Object key): 根据键获取值. 如果键不存在, 则返回null

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

        Set<K> keySet(): 获取Map集合中所有的键, 存储到Set集合中

        Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的Entry对象的集合(Set集合)

补充:                              

entry 节点                                       
Map key value                                   public class Entry {   
+---------------+                               K key;
                                               V value;
| K key, V value|                               V getValue();                           
                                               K getKey();
+---------------+                                                        

// JDK 9对于集合初始化的优化
java.util.List
    // 静态方法
    static List<E> of(E... e): 返回包含指定元素的 不可变List 集合
   
java.util.Set
    // 静态方法
    static Set<E> of(E... e): 返回包含指定元素的 不可变Set 集合
   
java.util.Map
    // 静态方法
    static Map<K, V> of(K k1, V v1): 返回包含指定键值对的 不可变Map 集合
Map遍历方式一: keySet()方法实现通过键找值
Set<K> keySet(): 获取Map集合中所有的键, 存储到Set集合中        
keySet()遍历步骤:
    1. Map对象调用 keySet() 方法, 获取包含所有key的Set集合
    2. 遍历Set集合, 获取每个key
            3. 通过Map对象调用 get(Object key) 方法根据key获取到value
            4. ![](C:\Users\hp\Desktop\微信图片_20181116100548.png)
[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();   //创建Map集合
            map.put();                              //为集合添加元素
        Set<String> key = map.keySet();         // 获取每个元素的键值 存到一个set集合中
        for (String keys : key) {               //遍历循环 set集合
        value=map.get(keys);                    //通过map集合中的方法get(key).通过key找到vlaue
            System.out.println(keys+"="+value);
        }
    }

[Java] 纯文本查看 复制代码
Map<String, Integer> map = new HashMap<>();
        map.put("赵丽颖", 168);
        map.put("杨颖", 165);
        map.put("林志玲", 178);
        Set<String> key = map.keySet();   //集合
        for (String keys : key) {               //keys 元素
            Integer value = map.get(keys);    //通过键获取值
            System.out.println(keys+"="+value);
        }
        System.out.println("--------------------");
        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            String keyss = iterator.next();
            Integer value = map.get(keyss);
            System.out.println(keyss+"="+value);
        }
        System.out.println("---------------------");
        for (String key1 : map.keySet()) {
            Integer value = map.get(key1);
            System.out.println(key1+"="+value);
        }

Entry键值对对象介绍
java.util.Map.Entry接口:         // 常用成员方法        K getKey(): 获取Entry对象中的键        V getValue(): 获取Entry对象中的值!        Entry对象就是一个节点, 节点中存储了key和value拿到一个Entry对象就可以从中获取key和value

[Java] 纯文本查看 复制代码
Map<String, String> map = new HashMap<>();
    // keySet()遍历
    Set<Map.Entry<String, String>> entries = map.entrySet();
    for (Map.Entry<String, String> entry : entries) {
        // 通过Entry对象获取每个键值对
        String value = entry.getKey();
        String value = entry.getValue();
        // 打印当前键值对
        System.out.println(key + "=" + value);
    }
/*创建HashMap集合, 存储以下键值对
        "赵丽颖", 168
        "杨颖", 165
        "林志玲", 178
使用entrySet()方式遍历Map, 打印键值对*/
public static void main(String[] args) {
       Map<String, String> map = new HashMap<>();
        map.put("赵丽颖", "赵颖");
        map.put("杨颖", "赵颖");
        map.put("林志玲", "赵颖");
        Set<Map.Entry<String, String>> set = map.entrySet();        //普通增强for循环
​
        for (Map.Entry<String, String> key : set) {
            String key1 = key.getKey();
            String value = key.getValue();
            System.out.println(key1+"="+value);
        }
        System.out.println("-------------------------");
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
​
        while (iterator.hasNext()){                             //迭代器循环
            Map.Entry<String, String> keys = iterator.next();
            String K = keys.getKey();
            String value = keys.getValue();
            System.out.println(K+"="+value);
        }
        System.out.println("-------------------------");
        for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
            String KK = stringStringEntry.getKey();
            String VV = stringStringEntry.getValue();           //简单增强for循环
            System.out.println(KK+"="+VV);
        }

java.util.Map接口        Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)
Map遍历方式2: 通过entrySet()获取Entry对象形式遍历
java.util.Map接口        Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)
entrySet()方法遍历Map步骤:        1. Map对象调用 entrySet() 获取包含所有Entry对象的Set集合        2. 遍历Set集合, 获取每个Entry对象        3. 调用Entry对象的 getKey() 和 getValue() 方法获取键和值
HashMap存储自定义数据类型作为键
HashMap存储自定义JavaBean对象作为key保证key唯一不重复, 需要让JavaBean重写 hashCode() 和 equals() 方法

定义Person类:
        私有成员变量: 姓名String name, 年龄int age
        生成无参/有参构造, set/get方法, toString, hashCode(), equals()
定义测试类:
        创建4个Person对象, 分别如下:
                "女王", 18
                "秦始皇", 18
                "普京", 30
                "女王", 18
        创建HashMap集合, 存入键为4个Person对象, 值为对应国家字符串: 英国, 秦国, 俄罗斯, 毛里求斯
        使用entrySet()方法遍历Map集合, 输出键值对
        
[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        HashMap<Person, String> map = new HashMap<>();
        Person p1=new Person("女王",18);
        Person p2=new Person("秦始皇",18);
        Person p3=new Person("普京",18);
        Person p4=new Person("女王",18);
        map.put(p1,"英国");
        map.put(p2,"秦国");
        map.put(p3,"俄罗斯");
        map.put(p4,"毛里求斯");
        for (Map.Entry<Person, String> personStringEntry : map.entrySet()) {
            Person key = personStringEntry.getKey();
            String value = personStringEntry.getValue();
            System.out.println(key+"--->"+value);
        }
        System.out.println("------------------");
        for (Person person : map.keySet()) {
            String values = map.get(person);
            System.out.println(person+"--->"+values);
        }
    }

   
//keySet();   person+map.get(person)
//entrySet();  元素.getkey(); 元素.getvalue();LinkedHashMap类
LinkedHashMap底层: 哈希表 + 链表         key不允许重复, 但key存取有序LinkedHashSet的底层就是使用LinkedHashMap实现的
JDK9对集合添加的优化
使用集合添加大量元素时, 反复add(...)比较麻烦. JDK 9 为集合提供了一些静态方法, 可以方便的对集合进行初始化

java.util.List

        // 静态方法

        static List<E> of(E... e): 返回包含指定元素的 不可变List 集合

        

java.util.Set

        // 静态方法

        static Set<E> of(E... e): 返回包含指定元素的 不可变Set 集合

        

java.util.Map

        // 静态方法

        static Map<K, V> of(K k1, V v1, ...): 返回包含指定键值对的 不可变Map 集合

        

注意:

1. of() 方法只适用于List接口, Set接口, Map接口, 不适用于接接口的实现类
2. of() 方法的返回值是一个不能改变的集合, 集合不能再使用 add(), put() 方法添加元素, 会抛出异常
3. Set接口和Map接口在调用 of() 方法的时候, 不能有重复的元素, 否则会抛出异常

/*
需求:
使用List.of()方法, 添加1,2,3, 获取集合对象, 使用增强for遍历打印输出
使用Set.of()方法, 添加1,2,3, 获取集合对象, 使用增强for遍历打印输出
使用Map.of()方法, 添加"a":1, "b":2, "c":3, 获取集合对象, 使用entrySet()遍历打印输出
*/
[Java] 纯文本查看 复制代码
public class Test {
    public static void main(String[] args) {
//        List<Integer> list = List.of(1, 2, 3);
//        List<Integer> list = List.of(1, 2, 3);  // int[] arr = {1,2,3,4}
//        ArrayList<Integer> arrayList = new ArrayList(list);

        ArrayList<Integer> arrayList = new ArrayList(List.of(1, 2, 3));

        arrayList.add(10);
        arrayList.add(20);
        for (Integer integer : arrayList) {
            System.out.println(integer);
        }

//        Set<Integer> set = Set.of(1, 2, 3);
        HashSet<Integer> set = new HashSet<>(Set.of(1, 2, 3));
        set.add(10);
        for (Integer integer : set) {
            System.out.println(integer);
        }

//        Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3);
        Map<String, Integer> map = new HashMap<>(Map.of("a", 1, "b", 2, "c", 3));
        map.put("z", 123);
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + "=" + value);
        }
    }
}

Debug调试模式介绍
断点:         breakpoint, 在debug模式下, 程序运行到断点会暂停住, 便于我们在程序运行过程中查看Debug调试程序:    可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug使用方式:    在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)    右键,选择Debug执行程序    程序就会停留在添加的第一个断点处执行程序:    f8:逐行执行程序    f7:进入到方法中    shift+f8:跳出方法    f9:跳到下一个断点,如果没有下一个断点,那么就结束程序    ctrl+f2:退出debug模式,停止程序    Console:切换到控制台
斗地主发牌案例**有(大小)序斗地主: 需求分析**需求: 实现斗地主发牌, 特殊要求是看牌时按照从小到大顺序排列

分析:

        准备牌:

                为了牌有大小顺序, 给牌编号, 一个编号对应一张牌: 0=大王, 1=小王, 2=♤2, 3=♤3

                编号和牌是一对一映射关系, 用HashMap<Integer, String>存储, key为编号, value为牌

                再为编号单独创建一个额外的ArrayList<Integer> pokerIndex

                定义编号变量 int index = 0;

                按照编号添加大小王

                嵌套for循环拼接序号和花色, 存入HashMap, 同时将编号存入ArrayList, 编号index++

        洗牌:

                Collections.shuffle(List list)将编号的ArrayList pokerIndex打乱顺序

        发牌:

                创建4个ArrayList, 前3个是玩家, 最后一个是底牌

                遍历编号的ArrayList pokerIndex, 发编号给玩家, >=51时发给底牌

                对4个ArrayList排序

        看牌

                定义方法: public static void lookPoker(String name,HashMap<Integer,String> poker,ArrayList<Integer> list)

                        打印姓名, 遍历编号集合ArrayList<Integer> list获取每个编号, 通过编号从HashMap<Integer,String> poker中获取牌, 打印

                调用方法



[Java] 纯文本查看 复制代码
public static void main(String[] args) {
        List<String> colors = List.of("♠", "♥", "♣", "♦");
        List<String> numbers = List.of("2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
        //创建map集合装字符
        Map<Integer, String> poker = new HashMap<>();
        //创建list集合装index
        ArrayList<Integer> pokerIndex = new ArrayList<>();
        int index=0;
        poker.put(index,"大王");
        pokerIndex.add(index);
        index++;
        poker.put(index," 小王");
        pokerIndex.add(index);
        index++;
        for (String color : colors) {
            for (String number : numbers) {
                poker.put(index,color+number);
                pokerIndex.add(index);
                index++;
            }
        }
​
        Collections.shuffle(pokerIndex);
        ArrayList<Integer> diPai = new ArrayList<>();
        ArrayList<Integer> Player1 = new ArrayList<>();
        ArrayList<Integer> Player2 = new ArrayList<>();
        ArrayList<Integer> Player3 = new ArrayList<>();
        for (int i = 0; i < pokerIndex.size(); i++) {
​
            if (i>=51){
                diPai.add(pokerIndex.get(i));
            }else if(i%3==0){
                Player1.add(pokerIndex.get(i));
​
            }else if (i%3==1){
                Player2.add(pokerIndex.get(i));
            }else if (i%3==2){
                Player3.add(pokerIndex.get(i));
            }
        }
        Collections.sort(Player1);
        Collections.sort(Player2);
        Collections.sort(Player3);
        lookPlayer("张飞",poker,Player1);
        lookPlayer("张飞",poker,Player2);
        lookPlayer("张飞",poker,Player3);
        lookPlayer("底牌",poker,diPai);
​
    }
        public static void  lookPlayer( String name,Map<Integer,String> poker,ArrayList<Integer> list){
            System.out.print(name+" ");
            for (Integer integer : list) {
                String pai = poker.get(integer);
                System.out.print(pai+" ");
            }
            System.out.println();
​
        }

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马