当前位置: 首页 > news >正文

DAY09 Map接口、斗地主案例(有序版本)、冒泡排序

学习目标

能够说出Map集合特点
	1.Map集合是一个双列集合,每个元素包含两个值,一个key一个value
	2.Map集合中的key是不允许重复的,value可以重复
	3.map集合中一个key只能对应一个value值
	4.Map集合中key和value数据类型是可以相同的,也可以不同
使用Map集合添加方法保存数据
	V put(K key, V value)  把指定的键与值添加到Map集合中
	返回值:V()
		key不重复,返回值就是null
		key重复,会使用新的value,替换之前的value,返回的就是被替换的value值
	Map<String,String> map = new HashMap<>();
	map.put("黄晓明", "杨颖"); //v=null
	map.put("黄晓明", "赵薇"); //v=杨颖
	map.put("冷锋","龙小云");
    map.put("杨过","小龙女");	
使用”键找值”的方式遍历Map集合
	1.使用Map集合中的方法keySet,把所有的key取出来,存储到一个Set集合中
    2.遍历Set集合,获取到Map集合中的每一个key
    3.使用Map集合中的方法get,根据key找到value
	Set<String> set = map.keySet();
	for (String key : set) {
		Integer value = map.get(key);
		System.out.println(key+"\t"+value);
	}
使用”键值对”的方式遍历Map集合
	1.使用Map集合中的方法entrySet,获取Map集合中的所有Entry对象,存储到一个Set集合中
	2.遍历Set集合,获取每一个Entry对象
	3.使用Entry对象中的方法getKey和getValue获取键与值
	Set<Map.Entry<String, String>> set = map.entrySet();
	for (Map.Entry<String, String> entry : set) {
		String key = entry.getKey();
		String value = entry.getValue();
		System.out.println(key+"\t"+value);
	}
能够使用HashMap存储自定义键值对的数据
	自定义类型(Person,Student)作为key:保证同名同年龄的人视为同一个人,需要重写hashCode和equals方法
	HashMap<String,Person> 不需要重写hashCode和equals方法,值是可以重复的
	HashMap<Person,String> 需要重写hashCode和equals方法,key是不允许重复的
能够完成斗地主洗牌发牌案例
	1.准备牌
	2.洗牌
	3.发牌
	4.排序
	5.看牌
能够完成冒泡排序
	使用数组中相邻元素,依次比较,每次选出最大的元素

第一章 Map集合

1.Map集合的概述

java.util.Map<k,v>:接口  key:键 value:值
特点:
	1.Map集合是一个双列集合,每个元素包含两个值,一个key一个value
	2.Map集合中的key是不允许重复的,value可以重复
	3.Map集合中一个key只能对应一个value
	4.Map集合中key和value数据类型可以是相同的,也可以是不同

请添加图片描述

2.Map集合常用的子类

1.java.util.HashMap<K,V>集合 implements Map<K,V>接口
	基于哈希表的 Map 接口的实现。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
	a.HashMap集合底层是一个哈希表结构和HashSet是一样
	b.是一个无序集合
2.java.util.LinkedHashMap<K,V>集合 extends HashMap<K,V>集合
	Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。
	a.LinkedHashMap集合底层是哈希表+单向链表和LinkedHashSet是一样
	b.是一个有序的集合
3.java.util.TreeMap<K,V>集合 implements Map<K,V>接口
	基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
	a.TreeMap底层是一个红黑树结构
	b.TreeMap集合自带了一个比较器,里边存储的key是有序的:默认是升序或者可以根据比较器自定义排序规则
	   和TreeSet是一样

3.Map的常用方法(重点)

package com.itheima.demo01Map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/*
    Map接口中的常用方法
        V put(K key, V value)  把指定的键与值添加到Map集合中
        V remove(Object key)  根据指定的键,删除键值对,返回被删除的值
        V get(Object key)  根据key获取value值
        boolean containsKey(Object key) 判断集合中是否包含指定的key
 */
public class Demo01Map {
    public static void main(String[] args) {
        show05();
    }

    /*
        Collection<V> values() 获取Map集合中所有的value值,把value值存储到一个Collection集合中
     */
    private static void show05() {
        Map<String,Integer> map = new HashMap<>();
        map.put("迪丽热巴",168);
        map.put("古力娜扎",165);
        map.put("冯提莫",150);
        map.put("林志玲",178);
        Collection<Integer> coll = map.values();
        System.out.println(coll);//[178, 168, 150, 165]
    }

    /*
        boolean containsKey(Object key) 判断集合中是否包含指定的key
        boolean containsValue(Object value)  判断集合中是否包含指定的value
     */
    private static void show04() {
        Map<String,Integer> map = new HashMap<>();
        map.put("迪丽热巴",168);
        map.put("古力娜扎",165);
        map.put("冯提莫",150);
        map.put("林志玲",178);

        boolean b1 = map.containsKey("冯提莫");
        System.out.println("b1:"+b1);//b1:true

        boolean b2 = map.containsKey("赵丽颖");
        System.out.println("b2:"+b2);//b2:false

        System.out.println(map.containsValue(150));//true
        System.out.println(map.containsValue(188));//false
    }

    /*
        V get(Object key)  根据key获取value值
        返回值:V(值)
            key存在:返回对应的value值
            key不存在:返回null
     */
    private static void show03() {
        Map<String,Integer> map = new HashMap<>();
        map.put("迪丽热巴",168);
        map.put("古力娜扎",165);
        map.put("冯提莫",150);
        map.put("林志玲",178);

        Integer v1 = map.get("迪丽热巴");
        System.out.println("v1:"+v1);//v1:168

        //int v2 = map.get("林志颖");//NullPointerException 自动拆箱
        Integer v2 = map.get("林志颖");
        System.out.println("v2:"+v2);//v2:null

    }

    /*
        V remove(Object key)  根据指定的键,删除键值对,返回被删除的值
        返回值:V(值)
            key存在:删除对应的键值对,返回被删除键值对中的值
            key不存在:对集合没有影响,返回null
     */
    private static void show02() {
        Map<String,Integer> map = new HashMap<>();
        map.put("迪丽热巴",168);
        map.put("古力娜扎",165);
        map.put("冯提莫",150);
        map.put("林志玲",178);
        System.out.println(map);//{林志玲=178, 迪丽热巴=168, 冯提莫=150, 古力娜扎=165}

        Integer v1 = map.remove("林志玲");
        System.out.println("v1:"+v1);//v1:178
        System.out.println(map);//{ 迪丽热巴=168, 冯提莫=150, 古力娜扎=165}

        Integer v2 = map.remove("马尔扎哈");
        System.out.println("v2:"+v2);//v2:null
        System.out.println(map);//{ 迪丽热巴=168, 冯提莫=150, 古力娜扎=165}

    }

    /*
        V put(K key, V value)  把指定的键与值添加到Map集合中
        返回值:V(值)
            添加元素的时候,key不重复,返回值V就是null
            添加元素的时候,key重复,会使用新的value,替换之前的value,返回的值V就是被替换的value
     */
    private static void show01() {
        //创建Map集合对象,泛型使用<String,String>
        Map<String,String> map = new HashMap<>();
        String v1 = map.put("黄晓明", "杨颖");
        System.out.println("v1:"+v1);//v1:null
        System.out.println(map);//{黄晓明=杨颖}

        String v2 = map.put("黄晓明", "赵薇");
        System.out.println("v2:"+v2);//v2:杨颖
        System.out.println(map);//{黄晓明=赵薇}

        map.put("冷锋","龙小云");
        map.put("杨过","小龙女");
        map.put("郭靖","黄蓉");
        map.put("尹志平","小龙女");
        System.out.println(map);//{杨过=小龙女, 尹志平=小龙女, 郭靖=黄蓉, 冷锋=龙小云, 黄晓明=赵薇}
    }
}

4.Map集合的遍历(重点)

1).键找值的方式

概述

请添加图片描述

代码实现
package com.itheima.demo01Map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
    Map集合的遍历_键找值方式
    使用到的方法:
        Set<K> keySet()  把所有的key取出来,存储到一个Set集合中
        V get(Object key)  根据key获取value值
    实现步骤:
        1.使用Map集合中的方法keySet,把所有的key取出来,存储到一个Set集合中
        2.遍历Set集合,获取Map集合中的每一个key
        3.使用Map集合中的方法get,根据key获取value值
 */
public class Demo02Map {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("迪丽热巴",168);
        map.put("古力娜扎",165);
        map.put("冯提莫",150);
        map.put("林志玲",178);
        //1.使用Map集合中的方法keySet,把所有的key取出来,存储到一个Set集合中
        Set<String> set = map.keySet();
        //2.遍历Set集合,获取Map集合中的每一个key
        //使用迭代器遍历Set集合
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            String key = it.next();
            //3.使用Map集合中的方法get,根据key获取value值
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
        System.out.println("-------------------------");
        //使用增强for循环遍历Set集合
        for (String key : set) {
            //3.使用Map集合中的方法get,根据key获取value值
            Integer value = map.get(key);
            System.out.println(key+"="+value);
        }
    }
}

2).键值对方式

概述

请添加图片描述

代码实现
package com.itheima.demo01Map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/*
    Map集合的遍历_键值对方式
    使用Map集合中的方法:
        Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
    Entry接口中的方法:
        K getKey() 返回与此项对应的键。
        V getValue() 返回与此项对应的值。
    实现步骤:
        1.使用Map集合中的方法entrySet,获取Map集合中所有的Entry对象,存储到一个Set集合中
        2.遍历Set集合,获取每一个Entry对象
        3.使用Entry对象中的方法getKey和getValue获取键与值
 */
public class Demo03Map {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("郭靖","黄蓉");
        map.put("杨过","小龙女");
        map.put("张无忌","赵敏");

        //1.使用Map集合中的方法entrySet,获取Map集合中所有的Entry对象,存储到一个Set集合中
        //成员内部类:外部类名.内部类名  Map.Entry
        Set<Map.Entry<String, String>> entrySet = map.entrySet();

        //2.遍历Set集合,获取每一个Entry对象
        //使用迭代器遍历Set集合
        Iterator<Map.Entry<String, String>> it = entrySet.iterator();
        while (it.hasNext()){
            Map.Entry<String, String> entry = it.next();
            //3.使用Entry对象中的方法getKey和getValue获取键与值
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }
        System.out.println("----------------------------");
        //使用增强for循环遍历Set集合  集合名.for
        for (Map.Entry<String, String> entry : entrySet) {
            //3.使用Entry对象中的方法getKey和getValue获取键与值
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"="+value);
        }
    }
}

5.HashMap存储自定义类型(重点)

package com.itheima.demo01Map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
    HashMap存储自定义类型(重点)
 */
public class Demo04HashMapSaveStudent {
    public static void main(String[] args) {
        show02();
    }

    /*
        HashMap存储自定义类型(重点)
        key:Student类型
            保证同名同年龄的学生,视为同一个学生,只能存储一次
            作为key的元素Student必须重写hashCode和equals方法,保证key唯一
        value:String类型
            可以重复
     */
    private static void show02() {
        //创建HashMap集合对象
        HashMap<Student,String> map = new HashMap<>();
        //往集合中添加键值对
        map.put(new Student("张三",18),"中国");
        map.put(new Student("女王",18),"英国");
        map.put(new Student("李四",2),"朝鲜");
        map.put(new Student("王五",38),"俄罗斯");
        map.put(new Student("女王",18),"毛里求斯");
        //使用entrySet方法+增强for循环遍历Map集合
        //1.使用Map集合中的方法entrySet,获取Map集合中所有entry对象,存储到一个Set集合中
        Set<Map.Entry<Student, String>> set = map.entrySet();
        //2.遍历Set集合,获取每一个Entry对象
        for (Map.Entry<Student, String> entry : set) {
            //3.使用Entry对象中的方法getkey和getValue,分别获取键与值
            Student key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"-->"+value);
        }
        System.out.println(map.size());//4

    }

    /*
        HashMap存储自定义类型(重点)
        key: String类型
            key是唯一,不重复:String类重写了hashCode和equals方法,所以可以保证唯一
        value:Student类型
            value是可以重复的
     */
    private static void show01() {
        //创建HashMap集合对象
        HashMap<String,Student> map = new HashMap<>();
        //往集合中存储键值对
        map.put("中国",new Student("张三",18));
        map.put("美国",new Student("李四",75));
        map.put("俄罗斯",new Student("王五",30));
        map.put("朝鲜",new Student("三胖",1));
        map.put("美国",new Student("公主",18));
        //使用keySet方法+增强for循环遍历Map集合
        //1.使用Map集合中的方法keySet,取出所有的key,存储到一个Set集合中
        Set<String> set = map.keySet();
        //2.遍历Set集合,获取每一个key
        for (String key : set) {
            //3.根据key获取value
            Student value = map.get(key);
            System.out.println(key+"--->"+value);
        }
    }
}
package com.itheima.demo01Map;

/*
    思考:自定义类型,什么时候重写hashCode和equals方法
        使用HashSet集合存储自定义类型
        使用HashMap集合,key使用自定义类型的时候(key不重复)
 */
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", 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;
    }

    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;
    }
}

6.LinkedHashMap集合(了解)

package com.itheima.demo01Map;

import java.util.HashMap;
import java.util.LinkedHashMap;

/*
    java.util.LinkedHashMap<K,V>集合 extends HashMap<K,V>集合
        Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
        此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。
    LinkedHashMap特点:
        a.LinkedHashMap集合底层是哈希表+单向链表和LinkedHashSet是一样
        b.是一个有序的集合
 */
public class Demo05LinkedHashMap {
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("aaa","111");
        map.put("bbb","222");
        map.put("ccc","333");
        map.put("aaa","444");
        map.put("ddd","555");
        System.out.println(map);//{aaa=444, ccc=333, bbb=222, ddd=555} key不允许重复,是一个无序的集合

        LinkedHashMap<String,String> linked = new LinkedHashMap<>();
        linked.put("aaa","111");
        linked.put("bbb","222");
        linked.put("ccc","333");
        linked.put("aaa","444");
        linked.put("ddd","555");
        System.out.println(linked);//{aaa=444, bbb=222, ccc=333, ddd=555} key不允许重复,是一个有序的集合

    }
}

7.TreeMap集合(使用)

package com.itheima.demo01Map;

import java.util.Comparator;
import java.util.TreeMap;

/*
    java.util.TreeMap<K,V>集合 implements Map<K,V>接口
	    基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
	TreeMap集合的特点:
        a.TreeMap底层是一个红黑树结构
        b.TreeMap集合自带了一个比较器,里边存储的key是有序的:默认是升序或者可以根据比较器自定义排序规则
           和TreeSet是一样
     构造方法:
        TreeMap() 使用键的自然顺序构造一个新的、空的树映射。
        TreeMap(Comparator<? super K> comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。
 */
public class Demo06TreeMap {
    public static void main(String[] args) {
        TreeMap<Integer,String> map = new TreeMap<>();
        map.put(1,"a");
        map.put(3,"b");
        map.put(2,"c");
        map.put(5,"d");
        map.put(4,"e");
        map.put(1,"w");
        System.out.println(map);//{1=w, 2=c, 3=b, 4=e, 5=d} 根据key默认升序排序

        TreeMap<Integer,String> map2 = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //根据key降序排序 o2-o1  升序:o1-o2
                return o2-o1;
            }
        });
        map2.put(1,"a");
        map2.put(3,"b");
        map2.put(2,"c");
        map2.put(5,"d");
        map2.put(4,"e");
        map2.put(1,"w");
        System.out.println(map2);//{5=d, 4=e, 3=b, 2=c, 1=w} key按照比较器规则排序
    }
}

8.Hashtable集合(了解–>面试)

package com.itheima.demo01Map;

import java.util.HashMap;
import java.util.Hashtable;

/*
    Hashtable集合(了解-->面试)
    java.util.Hashtable<K,V>集合 implements Map<K,V>接口
        此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。
    --------------------------------------------------
    HashMap集合的特点:
        1.HashMap集合底层是一个哈希表
        2.HashMap集合是jdk1.2版本之后出现的
        3.HashMap集合运行存储null值和null键
        4.HashMap集合是不同步的,效率高(多线程不安全)
    Hashtable集合的特点:
        1.Hashtable集合底层是一个哈希表
        2.Hashtable集合是jdk1.0时期出现的双列集合(最早期)
        3.Hashtable集合不允许存储null值和null键
        4.Hashtable集合是同步的,效率低(多线程安全)
   -----------------------------------------------------
   Hashtable集合效率没有HashMap高,所以已经被淘汰了
   但是Hashtable集合的子类Properties集合依然活跃在历史的舞台
 */
public class Demo07Hashtable {
    public static void main(String[] args) {
        HashMap<String,String> map = new HashMap<>();
        map.put("a",null);
        map.put(null,"b");
        map.put(null,null);
        System.out.println(map);//有几对元素 {null=null, a=null}

        Hashtable<String,String> table = new Hashtable<>();
        //table.put("a",null);//NullPointerException
        //table.put(null,"b");//NullPointerException
        table.put(null,null);//NullPointerException
    }
}

9.Map集合的练习

需求:

​ 输入一个字符串,统计字符串中每个字符出现次数

分析:

请添加图片描述

代码实现:

package com.itheima.demo01Map;

import java.util.HashMap;
import java.util.Scanner;

/*
    需求:
        输入一个字符串,统计字符串中每个字符出现次数
    分析:
        1.使用Scanner获取用户输入的一个字符串
        2.创建一个Map集合,key使用Character类型存储字符,value值使用Integer类型,存储字符个数
        3.遍历字符串,获取字符串中每一个字符
            a.使用length()方法+charAt(i)方法遍历字符串
            b.使用toCharArray()方法,把字符串转换为字符数组,遍历数组
        4.使用Map集合中的方法containsKey,判断集合中是否包含指定的key(遍历得到的字符)
            boolean containsKey(Object key)
            true:包含指定的字符
                a.根据key(遍历得到的字符),获取value(字符个数)
                b.value++
                c.把改变后的value存储到Map集合中(更新)
            false:不包含指定的字符,字符第一次往集合中存储
                put("字符",1);
 */
public class Demo08Test {
    public static void main(String[] args) {
        //1.使用Scanner获取用户输入的一个字符串
        System.out.println("请输入一个字符串:");
        String s = new Scanner(System.in).nextLine();

        //2.创建一个Map集合,key使用Character类型存储字符,value值使用Integer类型,存储字符个数
        HashMap<Character,Integer> map = new HashMap<>();

        //3.遍历字符串,获取字符串中每一个字符
        //a.使用length()方法+charAt(i)方法遍历字符串
        /*for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            System.out.println(c);
        }*/
        //b.使用toCharArray()方法,把字符串转换为字符数组,遍历数组
        char[] arr = s.toCharArray();
        for (char c : arr) {
            //4.使用Map集合中的方法containsKey,判断集合中是否包含指定的key(遍历得到的字符)
            //boolean containsKey(Object key)
            if(map.containsKey(c)){
                //true:包含指定的字符
                //a.根据key(遍历得到的字符),获取value(字符个数)
                Integer value = map.get(c);
                //b.value++
                value++;
                //c.把改变后的value存储到Map集合中(更新)
                map.put(c,value);
            }else{
                //false:不包含指定的字符,字符第一次往集合中存储
                //put("字符",1);
                map.put(c,1);
            }

            /*
                JDK1.8版本之后Map集合新增了一个方法(了解)
                default V getOrDefault​(Object key, V defaultValue)
                    返回指定键映射到的值,如果此映射不包含该键的映射,则返回 defaultValue 。
                    参数:
                        Object key:map集合中的key
                        V defaultValue:给对应key设置一个默认的value值
                    返回值:
                        V:如果集合中key存在,根据key获取value值返回
                          如果集合中key不存在,返回设置的默认值
             */
            //Integer value = map.getOrDefault(c, 0);
            //map.put(c,++value);
        }
        System.out.println(map);//{a=4, b=4, c=2}
    }
}

10.集合嵌套

  • 集合的嵌套:集合中的元素仍然是一个集合
  • 任何集合之间都可以相互嵌套
  • List集合可以嵌套Set集合,Set集合也可以嵌套List集合,List集合可以嵌套Map集合…
  • 注意:只要看到集合就遍历

请添加图片描述

1).List嵌套List(重点)

package com.itheima.demo02Collection;

import java.util.ArrayList;

/*
    List嵌套List(重点)
 */
public class Demo01ListList {
    public static void main(String[] args) {
        //假如我们有两个班级的学生,分别存储到两个List集合中
        //定义一个存储第一个班级学生的List集合
        ArrayList<String> list01 = new ArrayList<>();
        list01.add("迪丽热巴");
        list01.add("古力娜扎");
        list01.add("赵丽颖");
        list01.add("杨幂");
        //定义一个存储第二个班级学生的List集合
        ArrayList<String> list02 = new ArrayList<>();
        list02.add("胡歌");
        list02.add("蔡徐坤");
        list02.add("霍建华");
        list02.add("陈伟霆");
        //定义一个List集合存储两个班级
        ArrayList<ArrayList<String>> allList = new ArrayList<>();
        //把存储学生的List集合添加到集合中
        allList.add(list01);
        allList.add(list02);

        //遍历allList集合,后驱集合中存储的每一个元素(ArrayList集合)
        for (ArrayList<String> list : allList) {
            //遍历每个班级的List集合,获取每一个学生的姓名
            for (String name : list) {
                System.out.println(name);
            }
        }
    }
}

请添加图片描述

2).List集合嵌套Map集合

package com.itheima.demo02Collection;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

/*
    List集合嵌套Map集合
 */
public class Demo02ListMap {
    public static void main(String[] args) {
        /*
            两个班级的学生,分别存储在两个Map集合中
                key:学生的学号
                value:学生的姓名
         */
        //定义第一个班级的Map集合
        HashMap<String,String> map1 = new HashMap<>();
        map1.put("it001","迪丽热巴");
        map1.put("it002","古力娜扎");

        //定义第二个班级的Map集合
        HashMap<String,String> map2 = new HashMap<>();
        map2.put("hm001","胡歌");
        map2.put("hm002","霍建华");

        //定义一个ArrayList集合,泛型使用HashMap<String,String>,存储两个班级的Map集合
        ArrayList<HashMap<String,String>> list = new ArrayList<>();
        list.add(map1);
        list.add(map2);

        //遍历List集合,获取List集合中存储的每一个Map集合
        for (HashMap<String, String> map : list) {
            //遍历Map集合,获取Map集合中的key和value
            Set<String> set = map.keySet();
            for (String key : set) {
                String value = map.get(key);
                System.out.println(key+"\t"+value);
            }
            System.out.println("-------------------------");
        }
    }
}

请添加图片描述

3).Map集合嵌套Map集合

package com.itheima.demo02Collection;

import java.util.HashMap;
import java.util.Set;

/*
    Map集合嵌套Map集合
 */
public class Demo03MapMap {
    public static void main(String[] args) {
        /*
            两个班级的学生,分别存储在两个Map集合中
                key:学生的学号
                value:学生的姓名
         */
        //定义第一个班级的Map集合
        HashMap<String,String> map1 = new HashMap<>();
        map1.put("it001","迪丽热巴");
        map1.put("it002","古力娜扎");

        //定义第二个班级的Map集合
        HashMap<String,String> map2 = new HashMap<>();
        map2.put("hm001","胡歌");
        map2.put("hm002","霍建华");

        /*
            创建Map集合
                key:存储班级的名称
                    传智888期
                    黑马888期
                value:存储学生的Map集合
                    map1
                    map2
         */
        HashMap<String,HashMap<String,String>> mapmap = new HashMap<>();
        //往集合中添加元素
        mapmap.put("传智888期",map1);
        mapmap.put("黑马888期",map2);

        //使用keySet方法获取mapmap集合中所有的key(班级名称),把key存储到一个Set集合中
        Set<String> classNameSet = mapmap.keySet();
        //遍历存储班级名称的Set集合,获取每一个班级名称(key)
        for (String className : classNameSet) {
            //根据班级名称(key),获取到集合中存储的value(存储班级的Map集合)
            HashMap<String, String> classMap = mapmap.get(className);
            //使用keySet方法获取classMap集合中所有的key(学号),把key存储到一个Set集合中
            Set<String> stuNumberSet = classMap.keySet();
            //遍历Set集合获取每一个学生的学号(key)
            for (String stuNumber : stuNumberSet) {
                //根据学生的学号(key)获取学生的姓名(value)
                String name = classMap.get(stuNumber);
                System.out.println("班级的名称:"+className+",学号:"+stuNumber+",姓名:"+name);
            }
        }
    }
}

请添加图片描述

第二章 斗地主综合案例:有序版本(重点)

1.需求分析:

请添加图片描述

2.代码实现:

package com.itheima.demo03Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/*
    斗地主综合案例:
        1.准备牌
        2.洗牌
        3.发牌
        4.排序
        5.看牌
 */
public class DouDiZhu {
    public static void main(String[] args) {
        //1.准备牌
        //定义HashMap集合,key:integer存储牌的索引,value:String存储组装好的牌
        HashMap<Integer,String> poker = new HashMap<>();
        //定义ArrayList集合,泛型Integer,存储牌的索引
        ArrayList<Integer> pokerIndex = new ArrayList<>();
        //定义一个变量,记录牌的索引(0-53)
        int index= 0;
        //定义两个ArrayList集合,一个存储牌的花色,一个存储牌的序号
        ArrayList<String> numbers = new ArrayList<>();
        ArrayList<String> colors = new ArrayList<>();
        //往集合中存储序号和花色
        Collections.addAll(numbers,"2","A","K","Q","J","10","9","8","7","6","5","4","3");
        Collections.addAll(colors,"♠","♥","♣","♦");
        //往扑克集合中存储大王和小王
        poker.put(index,"大王");
        pokerIndex.add(index);
        index++;//改变牌的索引0->1
        poker.put(index,"小王");
        pokerIndex.add(index);
        index++;//改变牌的索引1->2

        //嵌套遍历两个List集合,组装52张牌(numbers集合必须写在外层)
        for (String number : numbers) {
            for (String color : colors) {
                //System.out.println(color+number);
                //把组装好的牌存储到集合中
                poker.put(index,color+number);
                pokerIndex.add(index);
                index++;//改变牌的索引2->3-->4-->5....53
            }
        }
        //System.out.println(poker);
        //System.out.println(pokerIndex);

        //2.洗牌 使用Collections集合中的shuffle(list)方法 随机打乱集合中元素的顺序
        Collections.shuffle(pokerIndex);
        //System.out.println(pokerIndex);

        //3.发牌
        //定义4个ArrayList集合存储玩家的牌和底牌
        ArrayList<Integer> player01 = new ArrayList<>();
        ArrayList<Integer> player02 = new ArrayList<>();
        ArrayList<Integer> player03 = new ArrayList<>();
        ArrayList<Integer> diPai = new ArrayList<>();
        //遍历存储牌的索引的ArrayList集合(pokerIndex),获取每一个牌的索引
        for (int i = 0; i < pokerIndex.size(); i++) {
            Integer pi = pokerIndex.get(i);
            //使用集合的索引%3给3个玩家发牌,索引>=51给底牌发牌(注意:必须先判断底牌)
            if(i>=51){
                //给底牌发牌
                diPai.add(pi);
            }else if(i%3==0){
                //给玩家1发牌
                player01.add(pi);
            }else if(i%3==1){
                //给玩家2发牌
                player02.add(pi);
            }else if(i%3==2){
                //给玩家3发牌
                player03.add(pi);
            }
        }
        //System.out.println(player01);
        //System.out.println(player02);
        //System.out.println(player03);
        //System.out.println(diPai);

        //4.排序  使用Collections集合工具类中的方法sort(list) 对List集合进行升序排序
        Collections.sort(player01);
        Collections.sort(player02);
        Collections.sort(player03);
        Collections.sort(diPai);

        //System.out.println(player01);
        //System.out.println(player02);
        //System.out.println(player03);
        //System.out.println(diPai);

        //5.看牌 调用看牌的方法
        lookPoker("刘德华",player01,poker);
        lookPoker("周润发",player02,poker);
        lookPoker("周星驰",player03,poker);
        lookPoker("底牌",diPai,poker);

    }

    /*
        定义一个看牌的方法:目的提高代码的复用性
        参数:
            String name:玩家名称
            ArrayList<Integer> list:玩家和底牌集合
            HashMap<Integer,String> poker:存储牌的索引和组装好的牌的poker集合
        实现方法:查表法
            遍历玩家|底牌集合,获取Map集合的每一个key,根据key找到value
     */
    public static void lookPoker(String name,ArrayList<Integer> list,HashMap<Integer,String> poker){
        //打印玩家名称,不换行
        System.out.print(name+": ");
        //遍历玩家|底牌集合,获取Map集合的每一个key
        for (Integer key : list) {
            //根据key找到value
            String value = poker.get(key);
            //打印查找到的牌,不换行
            System.out.print(value+" ");
        }
        //打印完每一个玩家|底牌的所有牌,换行
        System.out.println();
    }
}

第三章 冒泡排序(重点)

1.原理

请添加图片描述

2.代码实现

package com.itheima.demo04bubbleSort;

import java.util.Arrays;

/*
    冒泡排序
        使用数组中相邻的元素依次比较,每次选出最大的元素
 */
public class Demo01BubbleSort {
    public static void main(String[] args) {
        int[] arr = {5,1,8,3};
        System.out.println("排序前数组中的元素:"+ Arrays.toString(arr));//排序前数组中的元素:[5, 1, 8, 3]

        /*
            冒泡排序
            1.定一个循环嵌套
                外层循环:控制比较的次数:arr.length-1
                内层循环:控制每次比较几对元素
                    为了防止索引越界异常: arr.lenth-1
                    为了让每次比较的元素对数依次减少: arr.length-1-i
            2.在循环中依次比较arr[j]和arr[j+1]的值,选出最大的
                比较两个元素,使用第三方变量交换位置
         */
        //1.定一个循环嵌套
        for (int i = 0; i < arr.length - 1; i++) {//外层循环:控制比较的次数:arr.length-1
            for (int j = 0; j < arr.length - 1 - i; j++) {//内层循环:控制每次比较几对元素
                //2.在循环中依次比较arr[j]和arr[j+1]的值,选出最大的
                if(arr[j]>arr[j+1]){
                    //比较两个元素,使用第三方变量交换位置
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println("排序后数组中的元素:"+Arrays.toString(arr));//排序后数组中的元素:[1, 3, 5, 8]
    }
}

相关文章:

  • Mysql100道高频面试题
  • DeepSeek开源周-汇总
  • CSS浮动详解
  • 稀疏数组学习
  • Vue3项目如何使用TailWind CSS保姆级教程
  • 使用Python开发以太坊智能合约:轻松入门与深度探索
  • Linux与UDP应用1:翻译软件
  • C++Primer学习(4.8位运算符)
  • Qt中如果槽函数运行时间久,避免阻塞主线程的做法
  • 250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示
  • 【数据结构】链表与顺序表的比较
  • Python精进系列:divmod 函数
  • 安装 Open WebUI
  • Vue3 中 defineOptions 学习指南
  • 频域分析:利用傅里叶变换(Fourier Transform)对图像进行深度解析
  • 浅谈DeepSeek对人形机器人赛道影响
  • Cloneable接口与clone方法---java
  • 基于51单片机的压力测量报警proteus仿真
  • python数据类型等基础语法
  • Spring源码分析のregisterrefresh全过程(上)
  • 三站合一网站建设/如何查询域名注册人信息
  • 网站怎么上传网站吗/电脑培训班零基础网课
  • 做网站批发利润怎么样/如何制作一个网页
  • 有经验的南昌网站制作/seo推广软件代理
  • 东莞集团网站建设/b2b网站平台
  • 哪里有服务好的网站建设公司/小红书怎么推广引流