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

news2024/9/20 18:37:31

目录

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 3
            data.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.coloradmin.cn/o/1925873.html

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

相关文章

C嘎嘎:函数模版和类模版

目录 泛型编程 函数模版 函数模版概念 函数模版的格式 函数模版的原理 函数模版的实例化 函数参数的匹配原则 类模版 类模版的定义格式 类模版的实例化 泛型编程 如何实现一个通用的交换函数呢 void Swap(int& left, int& right) {int temp left;left rig…

【每日一练】python之sum()求和函数实例讲解

在Python中&#xff0c; sum()是一个内置函数&#xff0c;用于计算可迭代对象&#xff08;如列表、元组等&#xff09;中所有元素的总和。如下实例&#xff1a; """ 收入支出统计小程序 知识点:用户输入获取列表元素添加sum()函数&#xff0c;统计作用 "&…

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景&#xff08;背景&#xff09;问题抽象&#xff08;挑战&#xff09;如何做&#xff08;行动&#xff09;获得了什么&#xff08;结果&#xff09;后记相关资源 通过胶水语言实现工…

Oracle 性能诊断包收费依据

Which Data Dictionary or Dynamic Performance Views Require Purchase of the Diagnostics and / or Tuning Pack? (Doc ID 2082355.1)​编辑To Bottom In this Document Goal Solution References APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.5 …

AI口语练习APP主要功能

AI口语练习APP主要功能可以分为以下几个方面&#xff0c;AI口语练习APP可以帮助用户克服练习口语的场地、时间、语言环境等限制&#xff0c;更方便、高效地练习口语&#xff0c;提高英语口语水平。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

Profibus协议转Profinet协议网关模块连接智能电表通讯案例

一、背景 在工业自动化领域&#xff0c;Profibus协议和Profinet协议是两种常见的工业通讯协议&#xff0c;而连接智能电表需要用到这两种协议之间的网关模块。本文将通过一个实际案例&#xff0c;详细介绍如何使用Profibus转Profinet模块&#xff08;XD-PNPBM20&#xff09;实…

电脑案件冲突问题

一.故障展示 有一天我打开了电脑,发现3这个数字按键一直在输入,拔了外界的键盘,他这个按键还是会冲突 ,就如同上面的图一样 ,可能是电脑内部的键位进了灰卡住了什么东西导致的,于是我果断就电脑上的按键给扣下来了,扣的时候不知道里面的结构非常的谨慎,所以没导致里面的结构被损…

Amazon EC2 部署Ollama + webUI

最近和同事闲聊&#xff0c;我们能不能内网自己部署一个LLM&#xff0c;于是便有了Ollama webUI的尝试 对于Linux&#xff0c;使用一行命令即可 curl -fsSL https://ollama.com/install.sh | shollama --help Large language model runnerUsage:ollam…

C语言 ——— const关键字

目录 const修饰变量 const修饰指针变量 const放在指针类型之前 const放在指针类型之后 小结 const修饰变量 当 const 修饰 int类型 的 变量a 后&#xff0c;此时的 变量a 就具有长属性&#xff0c;就不能被赋值为其他的值 将 变量a的地址 存储到 指针变量pa 中&#xff…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not iterable

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 对非数组类型使用 for...of 循环2. 对非可迭代对象使用扩展运算符3. 在 Promise.all 中传递非可迭代对象4. 使用解构赋值时&#xff0c;右侧值非可迭代 四、解决方案与预防措施1. 确保使用可迭代对象2. 使用…

开源项目的浪潮:机遇、挑战与未来展望

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

二分查找和斐波那契查找

这里写自定义目录标题 二分查找斐波那契查找二分查找改进B二分查找改进C 二分查找 int binSearch(int* arr, int lo, int hi,int target) {while (lo < hi){int mid lo ((hi - lo) >> 1);if (arr[mid] > target) hi mid;else if (arr[mid] < target) lo mi…

【postgresql】锁

PostgreSQL 提供了多种锁模式来控制对表和行的并发访问&#xff0c;以确保数据的一致性和完整性。这些锁模式包括表级锁和行级锁&#xff0c;它们可以由应用程序显式控制&#xff0c;也可以在执行大多数 PostgreSQL 命令时自动获取。 锁类型 PostgreSQL类型的锁包括&#xff…

【JavaEE】网络编程——TCP

&#x1f921;&#x1f921;&#x1f921;个人主页&#x1f921;&#x1f921;&#x1f921; &#x1f921;&#x1f921;&#x1f921;JavaEE专栏&#x1f921;&#x1f921;&#x1f921; 文章目录 前言1.网络编程套接字1.1流式套接字(TCP)1.1.1特点1.1.2编码1.1.2.1ServerSo…

开发个人Ollama-Chat--10 绑定域名

开发个人Ollama-Chat–10 绑定域名 域名购买最好找正规的渠道购买&#xff0c;不要因贪图小便宜而多走很多的弯路。我就是第一次购买域名&#xff0c;到了一个坑壁的平台"西部数码"&#xff0c;SSL证书申请了2个月&#xff0c;没下来&#xff0c;客服也贼不专业&…

SAP 消息输出 - Adobe Form

目录 1 安装链接 2 前台配置 - Fiori app 2.1 维护表单模板 (maintain form templates) 2.2 管理微标 (manage logos) 2.3 管理文本 (manage texts) 3 后台配置 3.1 定义表单输出规则 3.2 分配表单模板 SAP 消息输出&#xff0c;不仅是企业内部用来记录关键业务操作也是…

GAN 如何打造人造名人身份?

GAN 如何打造人造名人身份&#xff1f; 文章目录 一、介绍二、生成对抗网络&#xff08;GAN&#xff09;三、什么是发电机&#xff1f;四、什么是鉴别器&#xff1f;五、对抗性训练六、实现七、数据7.1 初始配置和设置7.2 数据加载器7.3 噪声产生7.4 发电机7.5 鉴别器 八、训练…

Appium自动化测试系列: 2. 使用Appium启动APP(真机)

历史文章&#xff1a;Appium自动化测试系列: 1. Mac安装配置Appium_mac安装appium-CSDN博客 一、准备工作 1. 安卓测试机打开调试模式&#xff0c;然后使用可以传输数据的数据线连接上你的电脑。注意&#xff1a;你的数据线一定要支持传输数据&#xff0c;有的数据线只支持充…

computed计算属性用法及方法对比

模板中的插值表达式虽然方便&#xff0c;但当要写复杂逻辑时就会变得臃肿&#xff0c;难以维护&#xff0c;遇上复杂逻辑时&#xff0c;推荐使用计算属性来描述以响应式状态的复杂逻辑。这里我们做个对比&#xff0c;先用表达式的方法进行计算&#xff0c;先把页面写好&#xf…

WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

环境&#xff1a; Win10 专业版 DELL7080 问题描述&#xff1a; WIN10开机突然&#xff0c;过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解决方案&#xff1a; 1.找到MEMORY.DMP文件内容&#xff0c;分析一下 Microsoft (R) Windows Debugger Version 10…