黑马Java—第16讲Map&泛型

197 阅读10分钟

❤️持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情

🎨 个人介绍

👉大家好,我是:旺仔不是程序员

👉认真分享技术,记录学习过程的点滴,如果我的分享能为你带来帮助,请支持我奥🍻

👉你的支持,是我每天更新的动力。

👉赞点:👍 留言:✍ 收藏:⭐

👉个人格言:想法一步一步的落实,才是你我前进最佳选择。

1. Map集合

1.1 Map集合概述和特点

1 )Map 集合概述

interface Map<K,V> K : 键的类型V : 值得类型

2 )Map 集合得特点

  1. 键值对映射关系
  2. 一个键对应一个值
  3. 键不能重复,值可以重复
  4. 元素存取无序

3 )Map 集合得基本使用

public class MapDemo01 {
    //创建集合对象
    Map<String, String> map = new HsahMap<String,String>();
    
    map.put("itheima001","林青霞");
    map.put("itheima002","张曼玉");
    map.put("itheima003","王祖贤");
    map.put("itheima003","柳岩");
    
    // 输出集合对象
    System.out.println(map);
}

1.2 Map 集合的基本功能

1 )方法介绍

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有兼职的对元素
boolean containKey(Object key)判断集合是否包含指定键
boolean containKey(Object value)判断集合是否包含指定值
Boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数

2 )代码实例

public class MapDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String ,String> map = new HashMap<String ,String>();
​
        //添加元素
        map.put("张无忌","赵敏");
        map.put("郭靖","蓉");
        map.put("杨过","小龙女");
        System.out.println(map);
​
        //删除元素
        System.out.println(map.remove("郭靖"));
        System.out.println(map);
​
        //移除所有元素
        map.clear();
        System.out.println(map);
​
        //判断集合是否包含指定的键
        System.out.println(map.containsKey("郭靖"));
        System.out.println(map.containsKey("郭襄"));
​
        //判断集合是否包含指定的值
        System.out.println(map.containsValue("蓉"));
​
        // 判断集合是否为空
        System.out.println(map.isEmpty());
​
        //集合的长度
        System.out.println(map.size());
​
        //输出集合对象
        System.out.println(map);
​
    }
}

1.3 Map集合的获取功能

1 )方法介绍

方法名说明
V get(Object key)根据键获取值
Set keySet( )获取所有的键的集合
Collection values()获取所有值的集合
Set<Map.Entry<K,V>>entrySet( )获取所有键值对对象的集合

2 )实例代码

 public static void main(String[] args) {
     //创建对象
     Map<String, String> map = new HashMap<String, String>();
​
     //添加元素
     map.put("张无忌", "赵敏");
     map.put("郭靖", "黄蓉");
     map.put("杨过", "小龙女");
​
     //根据键获取值
     System.out.println(map.get("张无忌"));
​
     //获取键的集合,遍历集合
     Set<String> keySet = map.keySet();
     for (String key : keySet) {
         System.out.println(key);
     }
​
     Collection<String> values = map.values();
     for (String value : values) {
         System.out.println(value);
     }
 }

1.4 Map 集合的遍历

1 )遍历思路

  1. 我们刚才存储的元素都是成对出现的,所以我们把Map看成是一个夫妻对的集合

    • 把所有的丈夫给集中起来
    • 遍历丈夫的集合,获取到每一个丈夫
    • 根据丈夫找到对应的妻子

2 )分析步骤

  1. 获取所有键的集合。用keySet()方法实现
  2. 遍历键的集合,获取到每一个键。用增强for实现
  3. 根据键去找值。用get(Object key) 方法实现

3 )代码实现

public class MapDemo01 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String ,String> map = new HashMap<>();
​
        //添加元素
        map.put("张无忌", "赵敏");
        map.put("郭靖", "黄蓉");
        map.put("杨过", "小龙女");
​
        //获取所有键的集合。用keySet()方法实现
        Set<String> keySet = map.keySet();
        //遍历键的集合,获取到每一个键,用增强for循环
        for(String key : keySet) {
            //根据键去找值
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }
    }
}

1.5 Map 集合的遍历

1 )遍历思路

  1. 我们刚才存储的元素都是成对出现的,所以我们把Map看成一个夫妻对的集合

    • 获取所有结婚证的集合
    • 遍历结婚证的集合,得到每一个结婚证
    • 根据结婚证获取丈夫和妻子

2 )步骤分析

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

    • Set<Map.Entry<K,V>>entrySet() : 获取所有键值对对象的集合
  2. 遍历键值对对象的集合,得到每一个键值对对象

    • 用增强for实现,得到每一个Map.Entry
  3. 根据键值对对象获取键和值

    • 用getKey() 得到键
    • 用getValue()得到值

3 )代码思路

public class MapDemo02 {
    public static void main(String[]  args) {
        
    }
}

1.6 Map 集合的案例

1.6.1 HashMap 集合练习之键是String值是Student

1 )案例需求

  1. 创建一个HashMap集合,键是学号(String),值是学生对象(Student)。存储三个键值对元素,并遍历

2 )代码实现

  1. 学生类
public class Student {
     private String name;
    private int age;
​
    public Student() {
    }
​
    public Student(String name, int age) {
        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;
    }
}
  1. 测试类
public class HashMapDemo {
    public static void main(String[] args) {
        // 创建HashMap集合对象
        HashMap<String,Student> hm = new HashMap<String,Student>();
        
        //创建学生对象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("张曼玉", 35);
        Student s3 = new Student("王祖贤", 33);
        
        //把学生添加到集合
        hm.put("itheima001", s1);
        hm.put("itheima002", s2);
        hm.put("itheima003", s3);
        
        //方式1 : 键值对
        Set<String> keySet = hm.keySet();
        for(String key : keySet) {
            Student value = hm.get(key);
            System.out.println(key + "," + value.getName() + "," + value.getAge());
        }
        System.out.println("--------");
        
        //方式2:键值对对象找键和值
        Set<Map.Entry<String,Student> entrySet = hm.entrySet();
        for(Map.Entry<String,Student> me : entrySet) {
            String key = me.getKey();
            Student value = me.getValue();
            System.out.println(key + "," + value.getName() + "," + value.getAge());
        }       
    }
}

1.6.2 HashMap 集合练习之键是student 值是String

1 )案例需求

  1. 创建一个HashMap集合,键是学生对象(Student),值是居住地(String),存储多个元素,并遍历。
  2. 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象

2 )代码示例

  1. 学生类
public class Student {
     private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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 boolean equals (Object o) {
        if(this == o) {
            return true
        }
        if(o == null || getClass() != o.getClass()) {
            return false;
        }
        
        Student student = (Student) o;
        
        if(age != student.age) {
            return false;
        }
        
        return name != null ? name.equals(Student.name) : student.name == null;
        
        @Override
        public int hashCode() {
            int result = name !=null ?  name.hashCode() : 0;
            result = 31 * result + age;
            return result;
        }
    }
} 
  1. 测试类
public class HashMapDemo {
    public static void main(String[] args) {
        //创建HashMap集合对象
        HashMap<Student,String> hm = new HashMap<Student,String>();
        
        //创建学生对象
        Student s1 = new Student("林青霞", 30);
        Student s2 = new Student("张曼玉", 35);
        Student s3 = new Student("王祖贤", 33);
        Student s4 = new Student("王祖贤", 33);
        
        //把学生添加到集合
        hm.put(s1, "西安");
        hm.put(s2, "武汉");
        hm.put(s3, "郑州");
        hm.put(s4, "北京");
        
        //遍历集合
        Set<Student> keySet = hm.keySet();
        for(Student key : keySet) {
            String value = hm.get(key);
            System.out.println(key.getName() + "," + key.getAge() + "," + value);
        }
    }
}

1.6.3 集合嵌套之ArrayList嵌套HashMap

1 )案例需求

  1. 创建一个ArrayList 集合,存储三个元素,每个元素都是HashMap
  2. 每一个HashMap 的键和值都是String ,并遍历

2 )代码实现

public class ArrayListIncludeHashDemo {
    public static void main(String[] args) {
        //创建ArrayList集合
        ArrayList<HashMap<String,String>> array = new ArrayList<HashMap<HashMap<String,String>();
        
        //创建HashMap集合,并添加键值对元素
        HashMap<String,String> hml = new  HashMap<String,String>();
        hm1.put("孙策", "大乔");
        hm1.put("周瑜", "小乔");
        //把HashMap作为元素添加到ArrayList集合
        array.add(hm1);
        
        HashMap<String, String> hm2 = new HashMap<String, String>();
        hm2.put("郭靖", "黄蓉");
        hm2.put("杨过", "小龙女");
        //把HashMap作为元素添加到ArrayList集合
        array.add(hm2);
        
        HashMap<String, String> hm3 = new HashMap<String, String>();
        hm3.put("令狐冲", "任盈盈");
        hm3.put("林平之", "岳灵珊");
        //把HashMap作为元素添加到ArrayList集合
        array.add(hm3);
        
        //遍历ArrayList集合
        for (HashMap<String, String> hm : array) {
            Set<String> key = hm.keySet();
            for(String key : keySet) {
                String value = hm.get(key);
                System.out.println(key + "," + value);
            }
            }
    }
}

1.6.4 集合嵌套之HashMap嵌套ArrayList

1 )案例需求

  1. 创建一个HashMap集合,存储三个键值对元素,每个键值对元素的键是String,值是ArrayList
  2. 每个ArrayList的元素是String,并遍历

2 )代码实现

public class HashMapIncludeArrayListDemo {
    public static void main(String[] args) {
        //创建HashMap 集合
        HashMap<String,ArrayList<String>> hm = new HashMap<String,ArrarList<String>>();
        
        //创建ArrayList集合,并添加元素
        ArrayList<String> sgyy = new ArrayList<String>();
        sgyy.add("诸葛亮");
        sgyy.add("赵云");
        //把ArrayList作为元素添加到HashMap集合
        hm.put("三国演义",sgyy);
        
        ArrayList<String> xyj = new ArrayList<String>();
        xyj.add("唐僧");
        xyj.add("孙悟空");
        //把ArrayList作为元素添加到HashMap集合
        hm.put("西游记",xyj);
        ArrayList<String> shz = new ArrayList<String>();
        shz.add("武松");
        shz.add("鲁智深");
        //把ArrayList作为元素添加到HashMap集合
        hm.put("水浒传",shz);
        
        //遍历HashMap集合
        set<String> keySet = hm.keySet();
        for(String key : keySet) {
            System.out.println(key);
            ArrayList<String> value = hm.get(key);
            for(String s : value) {
                System.out.println("\t"+s);
            }
        }
    }
}

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

1 )案例需求

  1. 键盘录入一个字符串,要求统计字符串中每个字符串出现的次数
  2. 举例:键盘录入"aababcabcdabcde" 在控制台输出:“a(5)b(4)c(3)d(2)e(1)”

2 )代码实现

public class HashMapDemo {
    public static void main(String[] args) {
        //键盘录入一个字符串
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String line = input.nextLine();
        //创建HashMap集合,键是Character,值是Integer
        TreeMap<Character,Integer> hm = new TreeMap<Character,Integer>();
        //遍历字符串得到每一个字符
        for (int i = 0; i < line.length(); i++) {
            char key = line.charAt(i);
            //拿得到的每一个字符作为键到HashMap集合中去找对应的值,看其返回值
            Integer value = hm.get(key);
            
            if (value == null) {
                //如果返回值是null:说明该字符在HashMap集合中不存在,就把该字符作为键,1 作为值存储
                hm.put(key,1);
            }else {
                value++;
                hm.put(key,value);
            }
        }
    }
}

2 .Collection集合工具类

2.1 Collection概述 和 使用

1 )Collection类的作用

  1. 是针对集合操作的工具

2 )Collection 类常用方法

方法名说明
public static void sort(List list)将指定的列表按升序排序
public static void reverse(List<?> list)反转指定表中元素的顺序
public static void shuffle(List<?> list)使用默认的随机源随机排列指定的列表

3 )示例代码

public class CollectionDemo01 {
    public static void main(String[] args) {
        // 创建集合对象
    }
}

2.2 ArrayList 集合存储学生并排序

1 )案例需求

  1. ArrayList:存储学生对象,使用Collection 对ArrayList进行排序
  2. 需求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

2 )代码实现

  1. 学生类
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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;
    }
    
    
}
  1. 测试类
public class CollectionDemo02 {
    public static void main(String[] args) {
        // 创建ArrayList集合对象
        ArrayList<Student> array = new ArrayList<Student>();
        
        //创建学生对象
        Student s1 = new Student("linqingxia", 30);
        Student s2 = new Student("zhangmanyu", 35);
        Student s3 = new Student("wangzuxian", 33);
        Student s4 = new Student("liuyan", 33);
        
        //把学生添加到集合
        array.add(s1);
        array.add(s2);
        array.add(s3);
        array.add(s4);
        
        //使用Collections对ArrayList集合排序
        //sort•(List<T> list, Comparator<? super T> c)
        Collections.sort(array,new Comparator<student>() {
            @Override 
            public int compare(Student s1,Student s2) {
                //按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
                int num = s1.getAge() - s2.getAge();
                int num2 = num ==0 ? s1.getName().compareTo(s2.getName()) : num;
                return num2;
            }
        });
        
        //遍历集合
        for(Student s : array) {
            System.out.println(s.getName() + "," + s.getAge());
        }     
    }
}

3. 斗地主案例

1 )案例需求:

  1. 通过程序实现斗地主过程中的洗牌,发牌和看牌

2 )代码实现

public class PokerDemo {
    public static void main(String[] args) {
        //创建一个牌盒,也就是定义一个集合对象,用ArrayList集合实现
        ArrayList<String> array = new ArrayList<String>();
        
        //往牌盒里面装牌
        //定义花色数组
        String[] colors = {"♦", "♣", "♥", "♠"};
        //定义点数数组
        String[] numbers =  {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
        
        for(String color : colors) {
            for(String number : numbers) {
                array.add(color + number);
            }
        }
        
        array.add("大王");
        array.add("小王");
        
        //洗牌,也就是把牌打散,用Collections 的 shuffle()方法实现
        Collections.shuffle(array);
        
        //发牌就是遍历集合,给三个玩家发牌
        ArrayList<String> lqxArray = new ArrayList<String>();
        ArrayList<String> lyArray = new ArrayList<String>();
        ArrayList<String> fqyArray = new ArrayList<String>();
        ArrayList<String> dpArray = new ArrayList<String>();
        
        for(int i = 0;i<array.size();i++) {
            String poker = array.get(i);
            if(i>= array.size() - 3 ) {
                bottomArray.add(poker);
            }else if(i % 3 == 0) {
                lqxArray.add(poker);
            }else if(i % 3 == 1) {
                lyArray.add(poker);
            } else if (i % 3 == 2) { 
                fqyArray.add(poker); 
            }
        }
        
        //看牌,也就是三个玩家分别遍历自己的牌
        lookPoker("林青霞",lqxArray);
        lookPoker("柳岩", lyArray);
        lookPoker("风清扬", fqyArray);
        lookPoker("底牌", dpArray);   
    }
    
    /** 看牌的方法 */
    public static void lookPoker(String name,ArrayList<String> array) {
        System.out.print(name + "的牌是:");
        for(String poker : array) {
            System,out.print(poker + " ");
        }
        System.out.println();
    }
}

4. 斗地主升级版本

1 )案例需求

  1. 通过程序实现斗地主的洗牌,发牌,和看牌:对牌进行排序

2 )代码实现

 public static void main(String[] args) {
     //创建HashMap, 键是编号,值是牌
     HashMap<Integer, String> map = new HashMap<Integer, String>();

     //创建ArrayList,存储编号
     ArrayList<Integer> array = new ArrayList<Integer>();

     //创建花色数组和点数数组
     String[] colors =  {"♦", "♣", "♥", "♠"};
     String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};

     //从0 开始 往HashMap里边存储编号,并存储对应的牌。同时往ArrayList里面存储编号
     int index = 0;

     for (String number : numbers) {
         for (String color : colors ) {
             map.put(index,number+color);
             array.add(index);
             index++;
         }
     }

     map.put(index,"小王");
     array.add(index);
     index++;

     map.put(index,"大王");
     array.add(index);

     // 洗牌用,Collections 的shuffle()方法实现
     Collections.shuffle(array);

     //发牌(发的是编号,为了保证编号是排序的,创建treeSet()集合接受

     TreeSet<Integer> lqxSet =  new TreeSet<>();
     TreeSet<Integer> lySet = new TreeSet<>();
     TreeSet<Integer> fqySet = new TreeSet<>();
     TreeSet<Integer> bottomSet = new TreeSet<>();

     for (int i = 0; i < array.size(); i++) {
         Integer x = array.get(i);
         if (i>=array.size() - 3) {
             bottomSet.add(x);
         }else if(i % 3==0) {
             lqxSet.add(x);
         }else if(i % 3==1) {
             lySet.add(x);
         }else if(i % 3==2) {
             fqySet.add(x);
         }
     }

     //调用看牌的方法
     lookPoker("林青霞", lqxSet, map);
     lookPoker("柳岩", lySet, map);
     lookPoker("风清扬", fqySet, map);
     lookPoker("底牌", bottomSet, map);
 }

private static void lookPoker(String name ,TreeSet<Integer> ts, HashMap<Integer, String> map) {
    System.out.println(name + "的牌是:");
    for (Integer key : ts) {
        String poker = map.get(key);
        System.out.print(poker + " ");
    }
    System.out.println();
}

🎈看完了不妨给我点个赞吧,👉你的支持,是我每天更新的动力...