目录Map

  • Map集合
    • 2.1 Map入门
    • 2.2 Map集合的成员方法
  • Collections类
  • 斗地主案例

苟有恒,何必三更眠五更起; 最无益,莫过一日曝十日寒。

Map集合

概述: Map集合是双列集合的顶层**接口,**他是来存储键值对对象的,其中键具有唯一性,而值是可以重复的.Map集合的常用子类主要有两个, 分别是: HashMap和TreeMap.

即:Map集合的数据结构只针对于键有效.

2 格式

public interface Map<K, V>     //K: 键的类型, V: 值的类型.
例如:itheima001 刘亦菲itheima002 赵丽颖itheima003 高圆圆

创建对象
因为Map 是接口,不能通过new关键字直接创建他的对象,我们可以通过多态的形式,创建其子类对象,从而实现创建Map集合对象的这个需求

2.1 Map入门

​ public V put(K key, V value)
​ 解释:
​ 往双列集合中添加元素, 键不存在则直接添加, 并返回null.
​ 键存在则用新值覆盖旧值, 并返回被赋值之前的值.

​ 3.4.1 需求
​ 定义Map集合, 键是学号, 值是学生的名字. (键值都是字符串类型).
​ 往Map集合中添加3对元素.
​ 打印Map集合对象.

public static void main(String[] args) {Map<String,String> map =new HashMap<>();//        往Map集合中添加3对元素.map.put("001","张三");map.put("002","李四");map.put("003","王五");map.put("003","赵六");System.out.println("map = " + map);}
console:
map = {001=张三, 002=李四, 003=赵六}

如果k值相等则直接覆盖掉,用之后的值填入之前的值

可以反推出第一次什么都不添加的时候,这个map对象里面是null

2.2 Map集合的成员方法

2.2.1 方法描述

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

有些方法直接输出是boolean类型的
Map集合的获取功能
方法描述

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

set跟直接打印集合的数值是一样的
但是set是获取所有值,不是打印值

需求
定义Map集合, 键是丈夫, 值是妻子. (键值都是字符串类型).
分别测试上述的7个方法.
步骤分析
获取所有键的集合。
解释: 用Map#keySet()方法实现
遍历键的集合,获取到每一个键。
解释: 用增强for实现
根据键去找值。
解释: 用Map#get(K key)方法实现

public static void main(String[] args) {Map<String,String> map =new HashMap<>();map.put("001","tz");map.put("002","tz1");map.put("003","tz2");//1获取所有键的集合。Set<String> keys = map.keySet();//2遍历键的集合,获取到每一个键。for (String key : keys) {String value = map.get(key);System.out.println(key+ "..." + value);}
public static void main(String[] args) {Map<String,String> map =new HashMap<>();map.put("鬼剑士","剑魂");map.put("格斗家","花花");map.put("神枪手","王大枪");//1获取所有键的集合。Set<Map.Entry<String,String>> entrys = map.entrySet();//2遍历键的集合,获取到每一个键。//for (String key : keys) {//    String value = map.get(key);//    System.out.println(key+ "..." + value);//}for (Map.Entry<String, String> entry : entrys) {String key = entry.getKey();String value = entry.getValue();System.out.println(key+"..." +value);}}

把Map看成是一个 -两个数- 的集合.(key,value)
利用map集合的entryset方法调用set的key和value值
通过Map#Set<Map.Entry<K,V>> entrySet()方法实现.
entrySet()方法的作用是: 获取所有键值对对象的集合
遍历键值对对象的集合,得到每一个键值对对象
解释:
用增强for实现,得到每一个Map.Entry
Map.Entry 就表示键值对对象的类型.
根据键值对对象获取键和值

用map.getKey()获取键
用map.getvalue() 获取值
 public static void main(String[] args) {Map<String,String> map =new HashMap<>();map.put("鬼剑士","剑魂");map.put("格斗家","花花");map.put("神枪手","王大枪");//1获取所有键的集合。Set<Map.Entry<String,String>> entrys = map.entrySet();//2遍历键的集合,获取到每一个键。//for (String key : keys) {//    String value = map.get(key);//    System.out.println(key+ "..." + value);//}for (Map.Entry<String, String> entry : entrys) {String key = entry.getKey();String value = entry.getValue();System.out.println(key+"..." +value);}}

案例2
2.2.1 案例一: 键是String值是Student
创建HashMap集合, 键是学号(String), 值是学生对象(Student).
往HashMap集合中添加3组数据.
通过两种方式, 遍历HashMap集合.
2.2.2 参考代码

public static void main(String[] args) {Map<String,Student> map =new HashMap<>();map.put("鬼剑士",new Student("剑魂",19));map.put("格斗家",new Student("花花",20));map.put("神枪手",new Student("漫游",21));Set<String> keys = map.keySet();for (String key : keys) {Student student = map.get(key);System.out.println(key+"..." +student);}System.out.println("--------------");//entrysetSet<Map.Entry<String, Student>> entries = map.entrySet();for (Map.Entry<String, Student> entry  : entries) {String key =  entry.getKey();Student value = entry.getValue();System.out.println(key +"..."+ value);}}

案例二: 键是Student值是String

创建HashMap集合, 键是学生对象(Student), 值是居住地(String).
往HashMap集合中添加3组数据.
通过两种方式, 遍历HashMap集合.
注意: HashMap集合想保证键的唯一性, 依赖hashCode()和equals()这两个方法.

public static void main(String[] args) {Map<Student,String> map =new HashMap<>();map.put(new Student("剑魂",19),"鬼剑士");map.put(new Student("花花",20),"格斗家");map.put(new Student("漫游",21),"神枪手");Set<Student> keys = map.keySet();for (Student key : keys) {String student = map.get(key);System.out.println(key+"..." +student);}System.out.println("--------------");//entrysetSet<Map.Entry<Student,String>> entries = map.entrySet();for (Map.Entry<Student,String> entry  : entries) {Student key =  entry.getKey();String value = entry.getValue();System.out.println(key + "..." + value);}}

案例三: ArrayList嵌套HashMap
需求
定义ArrayList<HashMap<String, String>>集合, 存储三个元素, 每个元素都是一个双列集合, 具体如下:
第一个双列集合, 记录的信息如下:
(“剑魂”,“鬼剑士”)
(“花花”,“格斗家”)
第二个双列集合, 记录的信息如下:
(“漫游”,“神枪手”)
(“奶爸”,“圣职者”)
第三个双列集合, 记录的信息如下:
(“剑豪”,“女鬼剑”)
(“奶萝”,“女魔法师”
把上述的三个双列集合当做元素对象, 添加到ArrayList集合中.
遍历ArrayList集合, 输出每个元素.

public static void main(String[] args) {ArrayList<HashMap<String,String>> arrayList =new ArrayList<>();HashMap<String, String> hashMap1 = new HashMap<>();hashMap1.put("剑魂","鬼剑士");hashMap1.put("花花","格斗家");HashMap<String, String> hashMap2 = new HashMap<>();hashMap2.put("漫游","神枪手");hashMap2.put("奶爸","圣职者");HashMap<String, String> hashMap3 = new HashMap<>();hashMap1.put("剑豪","女鬼剑");hashMap1.put("奶萝","女魔法师");arrayList.add(hashMap1);arrayList.add(hashMap2);arrayList.add(hashMap3);for (int i = 0; i < arrayList.size(); i++) {HashMap<String, String> hashMap = arrayList.get(i);for (String key : hashMap.keySet()) {String values = hashMap.get(key);System.out.println(key +"..."+values);}}System.out.println("--------------");}

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

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一串字母:");String result  = scanner.nextLine();//创建TreeMap集合对象,字符作键,次数做值.TreeMap<Character, Integer> tm = new TreeMap<>();//将接收到的字符串返回成charchar[] chs = result.toCharArray();//遍历, 获取到每一个字符.for (char ch : chs) {//判断该字符在双列集合中是否存在.不存在,直接存储,次数为1if(!tm.containsKey(ch)){tm.put(ch,1);//存在,次数+1}else{tm.put(ch,tm.get(ch)+1);}}//将双列集合中的数据拼接成指定的字符串.StringBuilder sb = new StringBuilder();for (Character key : tm.keySet()) {//Integer value = tm.get(key);sb.append(key).append("(").append(tm.get(key)).append(")");}System.out.println(sb.toString());}

Collections类

针对集合操作的工具类.
5.2 常用方法
5.2.1 常用方法如下
方法名 说明
public static void sort(List list) 将指定的列表按升序排序
public static void reverse(List<?> list) 反转指定列表中元素的顺序
public static void shuffle(List<?> list) 使用默认的随机源随机排列指定的列表
5.2.2 需求
定义ArrayList集合, 存储5个整数.
分别测试上述的3个方法.

public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("1");arrayList.add("2");arrayList.add("3");arrayList.add("4");arrayList.add("5");arrayList.add("6");arrayList.add("7");System.out.println(arrayList);Collections.sort(arrayList);System.out.println(arrayList);Collections.reverse(arrayList);System.out.println(arrayList);Collections.shuffle(arrayList);System.out.println(arrayList);}

斗地主案例

通过代码实现斗地主过程中的洗牌,发牌和看牌动作.

package Demo;import javax.xml.ws.soap.Addressing;
import java.util.*;public class Demo_03 {public static void main(String[] args){ArrayList<String> arrayList = new ArrayList<>();//定义花色数组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) {arrayList.add(color+number);}}arrayList.add("小王");arrayList.add("大王");Collections.shuffle(arrayList);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 < arrayList.size(); i++) {//    String poker = arrayList.get(i);//    if(i>= arrayList.size()-3){//        dpArray.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();}
}
console:
林青霞的牌是:♥J ♦5 ♣K ♦4 ♠3 ♥K ♠5 ♣5 ♦6 ♦7 ♣7 ♥10 大王 ♥A ♠4 ♥5 ♣2
柳岩的牌是:♥7 ♦A ♣3 ♠J 小王 ♥2 ♥9 ♦9 ♦3 ♣A ♦10 ♦J ♠2 ♠8 ♥3 ♣10 ♣6
风清扬的牌是:♥6 ♠K ♥4 ♠6 ♠9 ♣Q ♠7 ♠Q ♣8 ♥8 ♣4 ♦8 ♦K ♠A ♠10 ♥Q ♣J
底牌的牌是:♦Q ♦2 ♣9 

排序之后的写法

public static void main(String[] args){HashMap<Integer,String> hm = new HashMap<>();ArrayList<Integer> array = 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);array.add(index);index++;}}hm.put(index, "小王");array.add(index);index++;hm.put(index, "大王");array.add(index);Collections.shuffle(array);TreeSet<Integer> lqxSet  = new TreeSet<>();TreeSet<Integer> lySet   = new TreeSet<>();TreeSet<Integer> fqySet  = new TreeSet<>();TreeSet<Integer> dpSet   = new TreeSet<>();for (int i = 0; i < array.size(); i++) {int x = array.get(i);if (i >= array.size() - 3) {dpSet.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, hm);lookPoker("柳岩", lySet, hm);lookPoker("风清扬", fqySet, hm);lookPoker("底牌", dpSet, hm);}public static void lookPoker(String name, TreeSet<Integer> ts, HashMap<Integer, String> hm) {System.out.print(name + "的牌是:");for (Integer key : ts) {String poker = hm.get(key);System.out.print(poker + " ");}System.out.println();}
console:
林青霞的牌是:♦4 ♣5 ♥5 ♣7 ♣8 ♠8 ♥9 ♠9 ♣10 ♦J ♥Q ♠Q ♦K ♦A ♣A ♠A ♦2
柳岩的牌是:♦3 ♣3 ♥3 ♠3 ♥4 ♦5 ♦6 ♣6 ♥6 ♥7 ♦8 ♦10 ♣J ♥J ♦Q ♣Q ♠2
风清扬的牌是:♣4 ♠4 ♠5 ♠6 ♦7 ♠7 ♥8 ♦9 ♣9 ♣K ♥K ♠K ♥A ♣2 ♥2 小王 大王
底牌的牌是:♥10 ♠10 ♠J 

大数据笔记11—java基础篇7(集合2-Map)相关推荐

  1. 大数据笔记10—java基础篇6(集合1-Collection)

    集合 集合(Collection) 一.迭代器<iterator> 案例一 二.并发修改异常 三.Collection集合 案例一(Collection练习) 案例二(Collection ...

  2. 大数据笔记9—java基础篇5(API)

    java_API API String类 创建字符串对象的区别对比 String字符串的特点 字符串的比较 例题(String) 例题1. 模拟登陆 例题2遍历字符串 例题3.案例 :统计字符次数 例 ...

  3. 大数据笔记8—java基础篇4(面向对象-封装-继承-多态)

    面向对象 一.面向对象 1.面向过程 1.2.举例 1.3.总结 二.面向对象 1.简述 2.举例 3.思想特点 2.1.类的定义格式 2.1.1.简述 2.2.2.格式 2.3.3.示例 三.类的使 ...

  4. 大数据笔记16—java基础篇12(JDBC 、连接池、事务)

    目录 JDBC jdbc概述 jdbc入门案例 API详解 jdbc工具类 预编译执行平台 1.SQL注入问题(安全问题) 2API详解:预处理对象(PreparedStatement) 使用连接池重 ...

  5. 大数据笔记30—Hadoop基础篇13(Hive优化及数据倾斜)

    Hive优化及数据倾斜 知识点01:回顾 知识点02:目标 知识点03:Hive函数:多行转多列 知识点04:Hive函数:多行转单列 知识点05:Hive函数:多列转多行 知识点06:Hive函数: ...

  6. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  7. 菜鸟学习笔记:Java基础篇6(数组、字符串)

    菜鸟学习笔记:Java常用类(数组.字符串) 数组 概述 数组的定义 二维数组 数组查找和排序 查找 排序 数组运用--字符串 不可变字符序列(String) 可变字符序列(StringBuilder ...

  8. 菜鸟学习笔记:Java基础篇4(面向对象三大特征)

    菜鸟学习笔记:Java面向对象篇中 继承 概念 方法重写(override) Object类 Super关键字 组合 final关键字补充 封装 访问控制符 多态 继承 概念 继续上一篇的例子: #m ...

  9. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

最新文章

  1. 2018-3-20论文(一种新型的智能算法-狼群算法WPA)笔记二(狼群系统分析,算法步骤)
  2. 我对图像金字塔的理解及OpenCV下的实现代码
  3. kinect在openni下也能玩抠出人物换背景
  4. 织梦编辑器加HTML视频显示很小,织梦去掉编辑器自动加div的方法即大小字情况...
  5. VMware虚拟机安装 windows server 2012 SQL server2012
  6. 计算机网络与社会需求,计算机网络的技术论文计算机网络与社会需求.doc
  7. 分享非常宝贵的工作经
  8. 什么样的作品才能上抖音热门?
  9. 百度地图添加多个大头针自定义图片
  10. 增量式编码器和绝对式编码器区别
  11. 【故事】跟零计算机基础的房东女儿讲了一下午的中间人劫持京东事件后,她感激涕零,决定给我免除房租(上)...
  12. 无配置WCF客户端的一个简单到令人发指的实现方法
  13. storm - 简介
  14. 微信退款服务器系统失败怎么办,微信缴费失败怎么退款?能退回吗?
  15. fpu测试_浮点运算单元FPU能给电机控制带来什么?
  16. java服务内存占用过高
  17. Facebook 授权登录(服务端)
  18. 联想创投王光熙:不光要投出AI独角兽,更要发现下一个N倍数机会
  19. 深度学习/机器学习入门基础数学知识整理(六):Hoeffding不等式,
  20. MIKE水动力笔记7_实测数据与模型输出结果的拟合对比

热门文章

  1. double类型数组排序
  2. mysql中count()函数用法:count(1)和count(*)有什么区别?
  3. 在Ubuntu平台上开发快递邮件查询Scope
  4. linux svn revert,svn revert 复原整个目录
  5. 良心安利龙/恐龙c4d模型素材网站
  6. 小程序获取sessionkey_微信小程序登录并且获取sessionkey详解
  7. 2006英语一text1
  8. 解读:气候预测产品应该怎么看?
  9. com.huawei.android,Android 集成、接入华为登陆和华为支付
  10. IT大佬之间的聚会:看他们都聊些什么!