JavaSE基础之 Map集合&&模拟斗地主

Map集合&&模拟斗地主

一、Map集合

1)Map集合概述和使用:Map(双列)集合是一个接口,Interface Map<K,V> k:键的类型,V:值的类型 ,Map集合是将键映射到值的对象;不能包含重复的键,每个键可以映射到最多一个值

例子:一个学生的学号对应一个学生的姓名

2)创建Map集合的对象使用多态的方法,使用实现类HashMap来实现,添加元素时,使用put(K,V)方法
范例:

package MapDemo;

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

public class MapDemo {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> mp = new HashMap< String,String>();
        //添加元素
        mp.put("姓名","李华");
        mp.put("学号","001");
        mp.put("科目","语文");
        mp.put("成绩","98");
        //输出集合
        System.out.println(mp);
    }
}

3)当键重复时,原先的元素将会被覆盖掉

4)Map集合的基本功能

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

5)Map集合的获取功能

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

范例:


```handlebars
package MapDemo;

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

//V get(Object key)		根据键获取值
//Set<K> keySet()	获取所有键的集合
//Collection<V> values()	获取所有值的集合

public class MapDemo {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> mp = new HashMap<String, String>();
        //添加元素
        mp.put("姓名", "李华");
        mp.put("学号", "001");
        mp.put("科目", "语文");
        mp.put("成绩", "98");
        //V get(Object key)		根据键获取值
        System.out.println(mp.get("姓名"));
        System.out.println("--------");
        //Set<K> keySet()	获取所有键的集合
        Set<String> ks = mp.keySet();
        for(String s :ks){
            System.out.println(s);
        }
        System.out.println("--------");
        //Collection<V> values()	获取所有值的集合
        Collection<String> col = mp.values();
        for (String s1 :col){
            System.out.println(s1);
        }
        System.out.println("--------");
        //输出集合
        System.out.println(mp);
        //
    }
}

6)Map集合的遍历方式一

首先,获取所有键的集合,用keySet()方法实现。其次,遍历键的集合,获取到每一个键,用增强for实现。最后,根据键去找值,用get(Object key)方法实现

范例:

package MapDemo;

import java.util.*;

public class MapDemo {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> mp = new HashMap<String, String>();
        //添加元素
        mp.put("姓名", "李华");
        mp.put("学号", "001");
        mp.put("科目", "语文");
        mp.put("成绩", "98");
        //遍历方式一
        Set<String> keySet = mp.keySet();
        for (String s:keySet){
            System.out.println("|"+s+"|"+mp.get(s)+"|");
        }
    }
}

7)Map集合遍历方式二

首先,获取所有键值对对象的集合:Set<Map.Entry<K,V>>entrySet(),其次,遍历键值对对象的集合,得到每一个键值对对象,用增强for实现,得到每一个Map.Entry。最后根据键值对对象获取键和值,用getKey()得到键,用getValue()得到值

范例:

package MapDemo;

import java.util.*;

//Set<Map.Entry<K,V>>entrySet()	获取所有键值对对象的集合

public class MapDemo {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> mp = new HashMap<String, String>();
        //添加元素
        mp.put("姓名", "李华");
        mp.put("学号", "001");
        mp.put("科目", "语文");
        mp.put("成绩", "98");
        //遍历方式二
        Set<Map.Entry<String,String>> set = mp.entrySet();
        for (Map.Entry<String,String> mpn :set){
            System.out.println("|"+mpn.getKey()+"|"+mpn.getValue()+"|");
        }
    }
}//Entry:词条

8)案例分析:HashMap集合存储学生对象并遍历

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

范例:

package MapDemo;

import java.util.*;

public class MapDemo {
    public static void main(String[] args) {
        //创建集合对象
        HashMap<String, Student> mp = new HashMap<String, Student>();
        Student s1 = new Student("18","Tom");
        Student s2 = new Student("20","Jerry");
        Student s3 = new Student("19","Lucy");
        //添加元素
        mp.put("001", s1);
        mp.put("002", s2);
        mp.put("003", s3);
        //遍历方式一
        Set<String> keySet = mp.keySet();
        for (String s :keySet){
            Student st = mp.get(s);
            System.out.println("|学号:"+s+"|姓名:"+st.getName()+"|年龄:"+st.getAge()+"|");
        }
        System.out.println("----------------------------");
        //遍历方式二
        Set<Map.Entry<String, Student>> set = mp.entrySet();
        for (Map.Entry<String,Student> me:set){
            System.out.println("|学号:"+me.getKey()+"|姓名:"+me.getValue().getName()+"|年龄:"+me.getValue().getAge()+"|");
        }
    }
}

9)案例分析:统计字符串中每个字符出现的次数

需求:键盘录入一个字符串,要求统计字符串出现的次数

范例:

package MapDemo;

import java.util.*;

public class MapDemo {
    public static void main(String[] args) {
        //创建集合对象
        HashMap<Character,Integer> map = new HashMap<Character, Integer>();
        //初始化集合
        map.put('a',0);
        map.put('b',0);
        map.put('c',0);
        map.put('d',0);
        map.put('e',0);
        map.put('f',0);
        map.put('g',0);
        map.put('h',0);
        map.put('i',0);
        map.put('j',0);
        map.put('k',0);
        map.put('l',0);
        map.put('m',0);
        map.put('n',0);
        map.put('o',0);
        map.put('p',0);
        map.put('q',0);
        map.put('r',0);
        map.put('s',0);
        map.put('t',0);
        map.put('u',0);
        map.put('v',0);
        map.put('w',0);
        map.put('x',0);
        map.put('y',0);
        map.put('z',0);
        //键盘录入字符穿
        System.out.println("请输入一个字符串");
        Scanner sc =new Scanner(System.in);
        String s = sc.nextLine();
        //遍历字符串并统计次数
        for (int x = 0;x<s.length();x++){
            Set<Character> keySet = map.keySet();
            char cc = s.charAt(x);
           if (map.get(cc)==null){
               Integer i = 1;
               map.put(cc,i);
           }
           else{
               Integer i = map.get(cc);
               i++;
               map.put(cc,i);
           }
        }
        //输出结果
        Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
        for(Map.Entry<Character, Integer> me:entrySet){
            System.out.println("|字母:"+me.getKey()+"|次数:"+me.getValue());
        }
    }
}

二、Collections

1)Collections概述和使用:Collections类是一个针对集合操作的工具类

2)Collections类的常用方法

public static <T extends Comparable<? super T>> void sort(List<T> list): 将指定的列表按升序排序

public static void reverse(List<?> list): 反转指定列表中元素的顺序

public static void shuffle(List<?> list): 使用默认的随机源随机排列指定的列表

三、模拟斗地主

通过程序实现斗地主过程中的洗牌、发牌和看牌。要求对牌进行排序

范例:

package MapDemo;

import java.util.*;

//模拟斗地主
public class FightTheLandlords {
    public static void main(String[] args) {
        //定义一个牌盒,创建HashMap,键是编号,值是牌
        HashMap<Integer, String> hm = new HashMap<Integer, String>();
        //创建ArrayList,存储编号
        ArrayList<Integer> arr = new ArrayList<Integer>();
        //创建花色,点数数组
        String[] colors = {"♥️", "♣️", "♦️", "♠️"};
        String[] num = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"};
        String Jok = "大王";
        String Jok2 = "小王";
        //从0开始往hm和arr里存储数据
        int index = 0;
        for (String number : num) {
            for (String color : colors) {
                String s = color + number;
                hm.put(index,s);
                arr.add(index);
                index++;
            }
        }
        hm.put(index,"小王");
        arr.add(index);
        index++;
        hm.put(index,"大王");
        arr.add(index);
        //洗牌
        Collections.shuffle(arr);
        //发牌
        TreeSet<Integer> pl1 = new TreeSet<Integer>();
        TreeSet<Integer> pl2 = new TreeSet<Integer>();
        TreeSet<Integer> pl3 = new TreeSet<Integer>();
        TreeSet<Integer> dp = new TreeSet<Integer>();;//底牌

        for (int i = 0; i < arr.size(); i++) {
            Integer pokr = arr.get(i);
            //最后三张牌作为底牌
            if (i >= arr.size() - 3) {
                dp.add(arr.get(i));
            }
            //索引对三取余对应三个玩家
            else if (i % 3 == 0) {
                pl1.add(arr.get(i));
            } else if (i % 3 == 1) {
                pl2.add(arr.get(i));
            } else if (i % 3 == 2) {
                pl3.add(arr.get(i));
            }
        }
        //看牌
        lookPok("玩家1", pl1,hm);
        lookPok("玩家2", pl2,hm);
        lookPok("玩家3", pl3,hm);
        lookPok("底牌", dp,hm);
    }

    //看牌的方法
    public static void lookPok(String name, TreeSet<Integer> arr,HashMap<Integer, String> pok) {
        System.out.print(name + "的牌是");
        for (Integer integer : arr) {
            System.out.print(pok.get(integer) + ",");
        }
        System.out.println();
    }
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页