JavaSE——集合框架二(4/6)-Map集合的遍历方式(键找值,键值对,Lambda)、Map集合案例(需求与分析,问题解决)

目录

Map集合的遍历方式

键找值

键值对

Lambda

Map集合案例

需求与分析

问题解决


Map集合的遍历方式

  • 键找值

先获取Map集合全部的键,再通过遍历键来找值。

  • 键值对

把“键值对”看成一个整体进行遍历(较为复杂)

  • Lambda

JDK 1.8 开始之后的新技术,结合Lambda表达式进行遍历

键找值

需要用到Map的如下方法:

方法名称说明
public Set<K> keySet()获取所有键的集合
public V get(Object key)根据键获取其对应的值

实例演示

import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTraversal1 {public static void main(String[] args){//准备一个Map集合Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",162.5);map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);System.out.println("-----------------------");//1.获取Map集合的全部键Set<String> keys = map.keySet();System.out.println(keys);System.out.println("-----------------------");//2.遍历全部的键,根据键获取其对应的值for(String key:keys){double value = map.get(key);System.out.println(key + "=====>" + value);}}
}

运行结果:

键值对

把“键值对”看成一个整体进行遍历,一般的形式是:

for (元素类型 变量:集合){

        ...

}

也就是,

for (元素类型 kv:map){

        ...

}

但是,元素类型无法直接确定

这时就需要用到其他方法:

Map提供的方法说明
Set<Map.Entry<K, V>> entrySetO获取所有“键值对”的集合
Map.Entry提供的方法说明
K getKey()获取键
V getValue()获取值

实例演示

import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTraversal2 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);System.out.println("-----------------------");//1.调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合Set<Map.Entry<String,Double>> entries = map.entrySet();for(Map.Entry<String,Double> entry: entries){//2.根据键值对类型的Set集合分别取出Map集合的键和值String key = entry.getKey();Double value = entry.getValue();System.out.println(key + "=======>" + value);}}
}

运行结果:

Lambda

  • 需要用到Map的如下方法
方法名称说明
default void forEach(BiConsumer<? super K,? super V> action)结合Lambda遍历Map集合

实例演示

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;public class MapTraversal3 {public static void main(String[] args) {Map<String,Double> map = new HashMap<>();map.put("蜘蛛精",169.8);map.put("紫霞",165.8);map.put("至尊宝",169.5);map.put("牛魔王",183.6);System.out.println(map);System.out.println("-----------------------");
//        map.forEach(new BiConsumer<String, Double>() {
//            @Override
//            public void accept(String k, Double v) {
//                System.out.println(k + "=======>" + v);
//            }
//        });map.forEach( (k, v) -> System.out.println(k + "=======>" + v) );}
}

运行结果:

<Ctrl>  + 鼠标左键点开forEach查看源码:

再查看 BiConsumer的源码,

它是有着函数式注解的函数式接口,所以可以通过Lambda表达式简化。

Map集合案例

需求与分析

需求

  • 某个班级80名学生,现在需要组织秋游活动,班长提供了四个景点依次是(A、B、C、D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。

分析

  • 将80个学生选择的数据拿到程序中去,[A,A,B,A,B,C,D,...]
  • 准备一个Map集合用于存储统计的结果,Map<String,Integer>,键是景点,值代表投票数量
  • 遍历80个学生选择的景点,每遍历一个景点,就看Map集合中是否存在该景点,不存在存入“景点=1”,存在则其对应值+1。

问题解决

import java.util.*;
import java.util.function.BiConsumer;public class MapCase1 {public static void main(String[] args) {//1.把80个学生选择的景点存入到集合中(采用随机存储)List<String> data = new ArrayList<>();
//        String[] selects = {"A","B","C","D"};//自定义一下景点String[] selects = {"永庆坊","动物园","博物馆","彩虹桥"};Random r = new Random();for(int i = 1; i <= 80;i++){//每次模拟一个学生选择一个景点,存入到集合中去int index = r.nextInt(4);  //0 1 2 3data.add(selects[index]);}System.out.println(data);System.out.println("-----------------------");//2.开始统计每个景点的投票人数//准备一个Map集合用于统计最终的结果Map<String,Integer> result = new HashMap<>();//3.开始遍历80个景点数据for(String s : data){//判断Map集合中是否存在该景点if(result.containsKey(s)){//存在,说明这个景点之后统计过,只需要给其值+1即可result.put(s,result.get(s) + 1);}else{//不存在,则说明这个景点是第一次统计,存入“景点 = 1”result.put(s,1);}}//4.查看Map集合System.out.println(result);//5.可以遍历一遍Map集合,输出最终的景点去向Set<String> keys = result.keySet();int max = 0,value = 0;String maxkey = "";for(String key:keys){value = result.get(key);if(value > max){max = value;maxkey = key;}}System.out.println("====最终景点去向====" + "\n" + maxkey + ":" + result.get(maxkey));}
}

运行结果:(不唯一)

需要存储一一对应的数据时,就可以考虑使用Map集合来做


END


学习自:黑马程序员——JavaSE课程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建GitLab代码私有仓库

构建代码私有仓库 公司代码仓库一般都放在git上&#xff0c;但为了安全一般都不会放在开放的git上&#xff0c;都会搭建自己的仓库&#xff0c;今天就记录一下git搭建的过程。以下安装过程以centos7为例&#xff1a; 步骤一&#xff1a;安装并配置依赖项&#xff0c;同时打开ht…

iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息&#xff0c;据DigiTimes最新报道&#xff0c;苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称&#xff0c;目前苹果已经将模组订单交至大立光电和玉…

带权重的随机选择算法

最终的结果是left的索引 代表大于等于target的最小索引&#xff0c; 用左边界的二分搜索原因是&#xff0c;如果没有目标值&#xff0c;left大于或者等于target class Solution {private int[] preSum;private Random randnew Random();public Solution(int[] w) {//写前缀和…

OpenGL笔记九之彩色三角形与重心插值算法

OpenGL笔记九之彩色三角形与重心插值算法 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记九之彩色三角形与重心插值算法1.运行3.main.cpp 1.运行 3.main.cpp 代码 #include <iostream>#define DEBUG//注意&#xff1a;glad…

推荐一款uniapp拖动验证码插件

插件地址&#xff1a;易盾验证码 - DCloud 插件市场 具体使用方式访问插件地址自行获取

2024.7.9.小组汇报postman分享会

文章目录 一、前言&#xff08;零&#xff09;安装&#xff08;一&#xff09;界面导航说明&#xff08;二&#xff09;发送第一个请求 二、基本功能&#xff08;一&#xff09;常见类型的接口请求(常见的接口有如下四种类型&#xff1a;1.查询参数的接口请求&#xff08;1&…

Java02--基础概念

一、注释 注释是在程序指定位置添加的说明性信息 简单理解&#xff0c;就是对代码的一种解释 1.单行注释 格式: //注释信息 2.多行注释 格式: /*注释信息*/ 3.文档注释 格式: /**注释信息*/ 注释使用的细节: 注释内容不会参与编译和运…

Linux 命令 —— top命令(查看进程资源占用)

文章目录 top 命令显示信息介绍top 命令使用 top 命令显示信息介绍 top 命令是 Linux/Unix 系统中常用的进程监控工具&#xff0c;可以实时动态显示系统中各个进程的资源占用情况&#xff0c;包括CPU、内存等。 进入 linux 系统&#xff0c;直接输入 top&#xff0c;回车&…

51单片机STC89C52RC——18.1 HC-SR04超声波测距

目的/效果 独立按键K1按下后开始测距&#xff0c;LCD显示距离&#xff08;mm&#xff09; 一&#xff0c;STC单片机模块 二&#xff0c;HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能&#xff0c;精度达3mm。 2.2 时序 以上时序图表明…

HCIA学习笔记(6)-ACL+NAT

ACL&#xff1a;访问控制列表 访问控制-------在路由器的入或者出接口上&#xff0c;匹配流量&#xff0c;之后产生动作-----只有允许或拒绝 定义感兴趣流量------帮助其他策略去抓流量 匹配规则&#xff1a;至上而下&#xff0c;逐一匹配&#xff0c;上条匹配按照上条执行&…

QTableView仿Excel表头排序和筛选

一.效果 Excel的排序和筛选弹窗如下所示 功能非常强大。不仅支持内容排序和筛选,还支持颜色的排序和筛选,而且还支持设置多种过滤条件。本文只仿最常用的内容排序和内容单过滤条件的筛选,效果如下所示。 从效果图中可以看出,表头Section中的按钮有下列六种状态 enum Butt…

算法的时间复杂度和空间复杂度-例题

一、消失的数字 . - 力扣&#xff08;LeetCode&#xff09; 本题要求的时间复杂度是O(n) &#xff0c;所以我们不能用循环嵌套&#xff1b; 解法一&#xff1a; int missingNumber(int* nums, int numsSize){int sum10;for(int i0;i<numsSize;i){sum1i;}int sum20;for(i…

成为CMake砖家(3):Windows安装make.exe

大家好&#xff0c;我是白鱼。相信很多朋友已经在用 CMake 做交叉编译了&#xff0c; 而交叉编译往往少不了 make.exe, 这篇来讲讲 make.exe 在 Windows 上的安装。 1. 交叉编译需要 generator CMake 本身是一个 meta build tool&#xff0c; 或者说它是派发任务到具体的 bui…

云计算练习题

第一题&#xff1a;每周日晚上11点59分需要将/data目录打包压缩到/mnt目录下并以时间命名 #crontab -e 59 23 * * 7 /bin/tar czvf /mnt/date %F-data.tar.gz /data 59 23 * * 7 /bin/tar czvf /mnt/date %T.tar.gz /data 第二题&#xff1a;查找出系统中/application目录下所有…

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…

离线语音识别芯片在智能生活中的应用

离线语音识别芯片&#xff0c;这一技术正逐渐渗透到我们日常生活的每一个角落&#xff0c;为众多产品带来前所未有的智能体验。它能够应用到多种产品中&#xff0c;‌包括但不限于&#xff1a;‌ 1、智能音箱&#xff1a;‌语音识别芯片作为智能音箱的核心&#xff0c;‌使用户…

钢铁与不锈钢区别

钢铁与不锈钢是两种比较特殊的金属材料&#xff0c;它们之间的主要区别可以从以下几个方面进行探讨&#xff1a; 钢属碳素钢&#xff1a;钢铁是含碳量介于0.02%至1.7%之间的铁合金&#xff0c;主要成分是铁&#xff08;Fe&#xff09;和碳&#xff0c;其中铁约占80%以上。它们…

Linux开发:Ubuntu22.04安装libcurl4

libcurl是一个跨平台的网络协议库&#xff0c;支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传&#xff0c;代理&#xff0c;cookies,和用户认证等&#xff0c;使用…

DNS域名解析原理及配置

目录 一、DNS原理 什么是DNS DNS 的作用 DNS 的工作原理 1. 用户输入域名 2. 查询本地 DNS 服务器 3. 递归查询 4. 根域名服务器 5. 顶级域名服务器 6. 权威 DNS 服务器 7. 返回结果 两种查询方式 二、DNS服务器系统类型 主域名服务器 从域名服务器 缓存域名服务…