Java之Map

目录

 

一、Map集合

1、概述

2、Map 常用子类

3、Map 接口中的常用方法

4、Map 集合遍历键找值方式

5、Entry 键值对对象

6、 Map 集合遍历键值对方式

7、HashMap 存储自定义类型键值

8、LinkedHashMap

二、模拟斗地主洗牌发牌


一、Map集合

1、概述

 Map 接口下的集合与 Collection 接口下的集合,它们存储数据的形式不同,如下图。

Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的
值。
Collection 中的集合称为单列集合, Map 中的集合称为双列集合。
需要注意的是, Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

2、Map 常用子类

HashMap :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需
要重写键的hashCode()方法、equals()方法。


LinkedHashMap :HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链
表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的
hashCode()方法、equals()方法。

Map接口中的集合都有两个泛型变量,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量的数
据类型可以相同,也可以不同。

3、Map 接口中的常用方法

public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的
值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)

4、Map 集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值
分析步骤:
1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
2. 遍历键的Set集合,得到每一个键。
3. 根据键,获取键所对应的值。方法提示: get(K key)

        //创建Map集合对象
        HashMap<String, String> map = new HashMap<String,String>();
        //添加元素到集合
        map.put("胡歌", "霍建华");
        map.put("郭德纲", "于谦");
        map.put("薛之谦", "大张伟");
        //获取所有的键  获取键集
        Set<String> keys = map.keySet();
        // 遍历键集 得到 每一个键
        for (String key : keys) {
           //key  就是键  
            //获取对应值
            String value = map.get(key);
            System.out.println(key+"的CP是:"+value);
        }

5、Entry 键值对对象

Map 中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在 Map 中是一一对应关
系,这一对对象又称做 Map 中的一个 Entry( 项) 。

Entry 将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历 Map 集合时,就可以从每一个键值对( Entry )对象中获取对应的键与对应的值。既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:
public K getKey() :获取Entry对象中的键。
public V getValue() :获取Entry对象中的值。


在Map集合中也提供了获取所有Entry对象的方法:
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。

6、 Map 集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
操作步骤与图解:
1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entrySet() 。
2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
3 . 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示: getkey() getValue()

package com.dzg.map;

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

public class TestMap {

    public static void main(String[] args) {
        Map<String,String> maps = new HashMap<String, String>();
        maps.put("1","first");
        maps.put("2","second");
        maps.put("3","third");

        Set<String> keys = maps.keySet();
        for (String key:
             keys) {
            String value = maps.get(key);
            System.out.println("键:"+key+"  值:"+value);
        }

        System.out.println("=================================");
        Set<Map.Entry<String,String>> entrySet = maps.entrySet();
        for (Map.Entry<String,String> entry:
             entrySet) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("键:"+key+"  值:"+value);
        }
    }
}

7、HashMap 存储自定义类型键值

当给 HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的
hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。???怎么复写???

8、LinkedHashMap
 

我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保
证有序,还要速度快怎么办呢?
在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。

计算一个字符串中每个字符出现的次数:

public class MapTest {
public static void main(String[] args) {
        //友情提示
        System.out.println("请录入一个字符串:");
        String line = new Scanner(System.in).nextLine();
        // 定义 每个字符出现次数的方法
        findChar(line);
    }
    private static void findChar(String line) {
        //1:创建一个集合 存储  字符 以及其出现的次数
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        //2:遍历字符串
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            //判断 该字符 是否在键集中
            if (!map.containsKey(c)) {//说明这个字符没有出现过
                //那就是第一次
                map.put(c, 1);
            } else {
                //先获取之前的次数
                Integer count = map.get(c);
                //count++;
                //再次存入  更新
                map.put(c, ++count);
            }
        }
        System.out.println(map);
    }
}

二、模拟斗地主洗牌发牌

package com.dzg.map;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Set;

public class GamePoker {

    public static void main(String[] args) {
        /**
         * 组装54张扑克牌
         */
        HashMap<Integer,String> pokerMap = new HashMap<Integer, String>();
        
        ArrayList<String> colors = new ArrayList<String>();
        ArrayList<String> numbers = new ArrayList<String>();
        //存储花色和数字
        Collections.addAll(colors,"♠","♥","♣","♦");
        Collections.addAll(numbers,"2","A","K","Q","J","10","9","8","7","6","5","4","3");

        //设置 存储编号变量
        int count = 1;
        pokerMap.put(count++,"大王");
        pokerMap.put(count++,"小王");
        //创建牌 存储到map中
        for (String number:
             numbers) {
            for (String color:
                 colors) {
                String card = color + number;
                pokerMap.put(count++,card);
            }
        }

        System.out.println(pokerMap);
        //打乱牌
        Set<Integer> numberSet = pokerMap.keySet();
        ArrayList<Integer> numberList = new ArrayList<Integer>();
        numberList.addAll(numberSet);

        Collections.shuffle(numberList);

        //创建三个玩家编号集合 和一个 底牌编号集合
        ArrayList<Integer> pNo1 = new ArrayList<Integer>();
        ArrayList<Integer> pNo2 = new ArrayList<Integer>();
        ArrayList<Integer> pNo3 = new ArrayList<Integer>();
        ArrayList<Integer> dp = new ArrayList<Integer>();

        for (int i = 0; i < numberList.size(); i++) {
            //获取编号
            Integer no = numberList.get(i);
            //发牌 留出底牌
            if (i >= 51) {
                dp.add(no);
            }else if( i %3 == 0){
                pNo1.add(no);
            }else if(i % 3 == 1){
                pNo2.add(no);
            }else{
                pNo3.add(no);
            }
        }

        //查看三人各自手中的牌(按照牌的大小排序)、底牌
        Collections.sort(pNo1);
        Collections.sort(pNo2);
        Collections.sort(pNo3);
        Collections.sort(dp);

        //进行牌面的转换
        ArrayList<String> user1 = new ArrayList<String>();
        ArrayList<String> user2 = new ArrayList<String>();
        ArrayList<String> user3 = new ArrayList<String>();
        ArrayList<String> dpai = new ArrayList<String>();

        for (Integer i:
             pNo1) {
            //根据编号找到牌面
            String card = pokerMap.get(i);
            //添加到对应的 牌面集合中
            user1.add(card);
        }

        for (Integer i:
             pNo2) {
            //根据编号找到牌面
            String card = pokerMap.get(i);
            //添加到对应的 牌面集合中
            user2.add(card);
        }
        for (Integer i:
             pNo3) {
            //根据编号找到牌面
            String card = pokerMap.get(i);
            //添加到对应的 牌面集合中
            user3.add(card);
        }
        for (Integer i:
             dp) {
            //根据编号找到牌面
            String card = pokerMap.get(i);
            //添加到对应的 牌面集合中
            dpai.add(card);
        }

        System.out.println("玩家1号:"+user1+user1.size());
        System.out.println("玩家2号:"+user2+user2.size());
        System.out.println("玩家3号:"+user3+user3.size());
        System.out.println("dipai:"+dpai);

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值