Map集合、Collections工具类、模拟斗地主

1. Map集合

1.1 概述

  • Interface Map<K,V> K:键的类型 V:值的类型

  • 将键映射到值的对象:不能包含重复的键;每个键可以映射到最多一个值。

  • 举例: 学生的学号和姓名

      dejavu001		李
    
      dejavu002		李淂加
    
      dejavu003		得加呜
    
  • 创建Map对象

    1.使用多态的方式

    2.具体实现类HashMap

    3.Map集合的方法

    方法名描述
    V put(K key, V value)添加元素
    v remover(Object key)根据键值对的值删除元素
    void clear()移除所有键值对元素
    boolean containsKey(Object key)判断是否为指定的键
    boolean containsValue(Object value)判断是否为指定的值
    boolean isEmpty()判断集合是否为空
    int Size()集合的长度,也就是键值对数量

1.2 Map集合的获取方法

方法名描述
V get(Object key)根据键获取值
Set keySet()获取所有键集合
Collection values()获取所有值集合

1.3 Map集合的遍历

因为map集合是键值对组合,所以可以理解为map是一个夫妻对的集合。

1.3.1 遍历思路
  • 把所有的丈夫都集中起来
  • 遍历丈夫的集合,获取每一个丈夫
  • 根据丈夫找到每一个妻子
1.3.2 Map集合中的操作
  • 获取所有键的集合,用keySet() 方法实现
  • 遍历键中的结合,用增强for循环实现
  • 根据键寻找对应的值,用get方法实现

Demo

package Map集合;

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

public class MapDemo2 {
    public static void main(String[] args) {
        //创建 Map 集对象
        Map<String, String> map = new HashMap<>();
        //添加值
        map.put("dejavu", "unknow");
        map.put("litieliang", "liyamin");
        map.put("lizhien", "beimu");
        //获取所有键的集合,用keySet() 方法实现
        Set<String> strings = map.keySet();
        //遍历键中的结合,用增强for循环实现
        //根据键寻找对应的值,用get方法实现
        for (String string : strings) {
            String s = map.get(string);
            System.out.println(s);
        }

    }
    
}
1.3.3 遍历思路
  • 获取所有结婚证的集合
  • 遍历结婚证的集合,得到每一个结婚证
  • 根据结婚证获取丈夫和妻子
1.3.4 Map集合中的操作
  • 获取所有键值对对象的集合

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

  • 遍历键值对对象的集合,得到每一个键值对

    ​ 用增强for实现,得到每一个Map.Entry

  • 根据键值对对象获取对应的键和值

    ​ 用getKey()得到键

    ​ 用getValue()得到值

Demo

package Map集合;

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

public class StudentMap {
    public static void main(String[] args) {
        Map<String,Student> stumap = new HashMap<>();
        Student stu1 = new Student("dejavu",20);
        Student stu2 = new Student("Key.L",27);
        Student stu3 = new Student("Yee",25);

        stumap.put("99",stu1);
        stumap.put("92",stu2);
        stumap.put("94",stu3);
        //遍历方式1
        Set<String> keySet = stumap.keySet();
        for(String s: keySet){
            Student student = stumap.get(s);
            System.out.println("19"+s+": "+student.getName()+" "+student.getAge());
        }
        System.out.println("- - - - - - - -");
        //遍历方式2
        Set<Map.Entry<String, Student>> entrySet = stumap.entrySet();
        for(Map.Entry<String, Student> entryy:entrySet){
            String key = entryy.getKey();
            Student value = entryy.getValue();
            System.out.println(key+""+value.getName()+" "+value.getAge());

        }

    }
}

Demo:统计字符串中每个字符出现的次数

package Map集合;

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

/*
        输入字符串,计算字符出现的次数。
 */
public class count {
    public static void main(String[] args) {
        //键盘键入字符串
        //创建hashMap集合
        //遍历字符串,得到每一个字符
        //拿得到的字符到hashMap中找对应的值,若是null则value值返回1
        //反之value值加+
        //按条件拼接
        //输出结果
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String line = sc.nextLine();
        HashMap<Character, Integer> hm = new HashMap<>();
        for (int i = 0; i < line.length(); i++) {
            char key = line.charAt(i);

            Integer value = hm.get(key);
            if(value == null){
                hm.put(key,1);
            }else{
                value++;
                hm.put(key,value);
            }
        }
        StringBuilder sb = new StringBuilder();
        Set<Character> keySet = hm.keySet();
        for(Character key:keySet){
            Integer value = hm.get(key);
            sb.append(key).append("(").append(value).append(")");
        }
        String result = sb.toString();
        System.out.println(result);
    }
}

2. Collentions类

Collections是针对集合操作的工具类

2.1 常用方法

  • public static extends Comparable<? super T>> void sort<List list>

    ​ 将指定列表按升序排列

  • public static void reverse(List<?> list)

    ​ 反转指定列表中元素的顺序

  • public static void shuffle(List<?> list)

    ​ 使用默认的随机源随机排列指定的列表

Demo:打扑克

package Map集合;

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

public class POKERDEMOO {
    public static void main(String[] args) {
        HashMap<Integer, String> hm = new HashMap<>();
        ArrayList<Integer> arr = new ArrayList<>();
        String[] colors = {"♠", "♥", "♣", "◆"};
        String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A","2"};

        int index = 0;
        for (String number : numbers) {
            for (String color : colors) {
                hm.put(index, color + number);
                arr.add(index);
                index++;
            }
        }
        hm.put(index, "大王");
        arr.add(index);
        index++;

        hm.put(index, "小王");
        arr.add(index);

        Collections.shuffle(arr);

        TreeSet<Integer> player1 = new TreeSet<>();
        TreeSet<Integer> player2 = new TreeSet<>();
        TreeSet<Integer> player3 = new TreeSet<>();
        TreeSet<Integer> dpoker = new TreeSet<>();

        for (int i = 0; i < arr.size(); i++) {
            int x = arr.get(i);
            if (i >= arr.size() - 3) {
                dpoker.add(x);
            } else if (i % 3 == 0) {
                player1.add(x);
            } else if (i % 3 == 1) {
                player2.add(x);
            } else if (i % 3 == 2) {
                player3.add(x);
            }
        }
        lookpoker("dejavu", player1, hm);
        lookpoker("lili", player2, hm);
        lookpoker("li", player3, hm);
        lookpoker("dpoker", dpoker, hm);
    }

    public static void lookpoker(String name, TreeSet<Integer> play, HashMap<Integer, String> hm) {
        System.out.print(name + "的牌为:");
        for (Integer i : play) {
            String s = hm.get(i);
            System.out.print(s);
        }
        System.out.println();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值