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 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课程

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cadence23学习笔记(二)

原理图设计界面中就可以直接新建PCB: 亲测&#xff1a;需要画完原理图&#xff0c;并且DRC通过之后才可以&#xff01; 放置完元器件之后要规定元件的Footprint &#xff0c;注意PCB封装名要和库文件中的名字对应&#xff1a; DRC按钮&#xff1a; 点击图标 N, 生成第一网表&…

MAVSDK动态库与静态库及mavsdk_server程序macOS平台编译与安装

1.克隆mavsdk: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译静态库 cmake -Bbuild/default -H. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF 生成makefile 生成成功,开始编译 cmake --build build/default -j8 成功生成libmavsdk.a 开…

给老笔记本安装双系统,太难了(centos+win10)记录一下过程

为什么要装个centos呢&#xff1f; 大学时期的笔记本&#xff0c;一直在吃灰&#xff0c;开机都卡。于是想废物利用一下&#xff0c;做个linux服务器玩&#xff0c;但是也不想直接删除win10&#xff0c;于是就开始开始装双系统。工作中的服务器基本都是centos的&#xff0c;所…

笔记 2 :linux 0.11 中的重要的全局变量 (a)

通过对全局变量的了解&#xff0c;也有助于了解整个代码的逻辑。就跟学习类一样&#xff0c;了解类有哪些成员变量&#xff0c;也有助于了解类的成员函数的功能。 以下介绍全局变量的顺序&#xff0c;符合这两本书的讲解顺序&#xff1a; &#xff08;1&#xff09;内存初始化相…

Python 获取今天(当天)、昨天(前一天)、前天(昨天的前一天)的开始时间、结束时间

描述&#xff1a;我这里是封装成DatetimeHelper工具类来调用 1.今天(当天)开始时间、结束时间 from datetime import datetime, timedeltaclass DatetimeHelper:# 获取当前的开始时间、结束时间(datetime类型)staticmethoddef getTodayStartEnd():# 获取当前的日期now datet…

记一次TIDB开启TLS失败导致PD扩容失败案例

作者&#xff1a; Dora 原文来源&#xff1a; https://tidb.net/blog/8ee8f295 问题背景 集群之前由于TIUP目录被删除导致TLLS证书丢失&#xff0c;后续需要重新开启TLS 在测试环境测试TLS开启步骤&#xff0c;导致后续两台PD扩容失败&#xff0c;步骤如下&#xff1a; …

Animate软件基础:库面板

“库”面板&#xff08;“窗口”>“库”&#xff09;是存储和组织在 Animate 中创建的元件的位置。还可以存储导入的文件&#xff0c;包括位图图形、声音文件和视频剪辑。 “库”面板可以在文件夹中组织库项目。 此外&#xff0c;可查看项目在文档中的使用频率&#xff0c;按…

JAVA从入门到精通之入门初阶(二)

1. 自动类型转换 自动类型转换&#xff1a;类型范围小的变量可以赋值给类型范围大的变量 byte->int public class java_7_10 {public static void main(String[] args) {//自动类型转换//类型范围小的变量可以赋值给类型范围大的变量 byte->intbyte a 12;int b a;//自动…

微信小程序密码 显示隐藏 真机兼容问题

之前使用type来控制&#xff0c;发现不行&#xff0c;修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…

Linux rsync文件同步工具

scp的不足 1. 性能问题 单线程传输 SCP只使用单线程进行传输&#xff0c;这意味着在传输大文件或大量小文件时&#xff0c;其传输速度和效率可能不如其他多线程工具。 无法压缩数据传输 SCP不支持内置的压缩机制&#xff0c;这在传输大文件时会导致带宽使用效率较低。 2.…

自动驾驶事故频发,安全痛点在哪里?

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;武汉城市留言板上出现了多条关于萝卜快跑的投诉&#xff0c;多名市民反映萝卜快跑出现无故停在马路中间、高架上占最左道低速行驶、转弯卡着不动等情况&#xff0c;导致早晚高峰时段出现拥堵。萝卜快跑是百度 A…

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…

OSPF.hello数据包

网络掩码---接口发出hello时会携带该接口的掩码 在建立邻居关系时会比较两端设备的掩码&#xff0c;如果掩码不一致则会导致建邻失败------注意&#xff1a;只有以太网链路才会检擦掩码 hello时间和死亡时间&#xff0c;注意这两个参数如果两端对应不上则会导致建邻失败。 可…

【QT】窗口MainWindow

目录 窗口的组成 菜单栏 图形化创建菜单栏 代码创建菜单栏 给菜单设置快捷键 添加子菜单 添加分割线 添加图标 创建menuBar的细节 工具栏 设置工具栏出现的初始位置&#xff08;上下左右&#xff09; 设置工具栏允许停靠的位置 设置不允许浮动 设置不允许移动…

2024 CCF编程能力等级认证Python认证(GESP)一级介绍

目录 1. GESP概述1.1 CSP-J/S认证1.1.1 证书含金量&#xff1a; 2. GESP一级认证内容3. GESP一级认证形式4. 认证时间与报名5. 政策与福利6. 备考建议 1. GESP概述 CCF编程能力等级认证&#xff08;Grade Examination of Software Programming&#xff0c;简称GESP&#xff09…

第3章 Express 的请求与响应(一)

在本章中&#xff0c;我们将详细探讨如何在 Express 中处理 HTTP 请求与响应。这包括解析请求数据、设置响应数据、处理表单数据、使用查询参数等。理解这些内容是开发高效和功能丰富的 Web 应用程序的基础。 1 解析请求数据 在 Express 中&#xff0c;可以通过 req 对象访问…

如何搭建互联网医院系统源码?医疗陪诊APP开发实战详解

今天&#xff0c;小编将为大家讲解如何搭建一个完整的互联网医院系统源码&#xff0c;并介绍医疗陪诊APP的开发实战。 一、互联网医院系统的架构设计 搭建一个完整的互联网医院系统&#xff0c;需要从架构设计开始。一个典型的互联网医院系统通常包含以下几个核心模块&#xf…

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

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

fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序

fortran简单排序算法&#xff0c;对一维、二维矩阵进行正序或倒序排序 0. 引言1. 算法实现1.1 一维数组排序1.2 二维数组排序1.2 module文件 2. 结语 0. 引言 排序算法是计算机科学中的一项重要技术&#xff0c;它将一组数据按照特定的顺序排列起来。排序算法有很多种&#xff…

【STM32项目】基于嵌入式智能网控微嵌式远距操控平台(完整工程资料源码)

基于嵌入式智能网控微嵌式远距操控平台 目录&#xff1a; 前言: 一、项目前景调研 1.1 研究背景及意义 1.2 国内外发展现状及趋势 1.2.1 国内现状 1.2.2 国外发展现状 1.2.3 发展趋势 二、什么是嵌入式&#xff1f; 2.1 嵌入式系统概述 2.2 嵌入式系统的组成 2.3 嵌入式操作系统…