当前位置: 首页 > news >正文

4 scala集合-Map

和 Java 一样,Scala 也有表示键值对(Key-Value)集合的 Map 数据结构。同样,Map 也分不可变和可变,不可变需要使用类 scala.collection.mutable.Map

1 不可变 Map

可以使用以下语法定义不可变 Map 对象

val/var map = Map(key1 -> value1, key2 -> value2, key3 -> value3, ...)   // 推荐,可读性好
val/var map = Map((key1, value1), (key2, value2), (key3, value3), ...)

下面例子,定义了一个球员与身价的 Map,并获取其中一名球员的身价,如果获取的 key 不存在,则会抛出 NoSuchElementException

scala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: Map[String, Int] = Map(C朗 -> 1500000, 美斯 -> 21000000, 夏兰特 -> 150000000, 姆总 -> 120000000)scala> map("美斯")
val res6: Int = 21000000scala> map("武磊")
java.util.NoSuchElementException: key not found: 武磊at scala.collection.immutable.Map$Map4.apply(Map.scala:515)... 35 elided

2 可变 Map

使用 scala.collection.mutable.Map 类,可实现可变 Map 集合,语法跟不可变 Map 一致:

scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> map("夏兰特")
val res8: Int = 150000000scala> map("武磊")
java.util.NoSuchElementException: key not found: 武磊at scala.collection.MapOps.default(Map.scala:274)at scala.collection.MapOps.default$(Map.scala:273)at scala.collection.AbstractMap.default(Map.scala:405)at scala.collection.mutable.HashMap.apply(HashMap.scala:425)... 35 elidedscala> map("武磊") = 1000000scala> map("武磊")
val res10: Int = 1000000

3 Map 的基本操作

3.1 获取值

获取 Map 集合中的值可以使用以下两种方式:

(1) 使用表达式 map(key),当 key 不存在会抛出 NoSuchElementException
(2) 使用 getOrElse(key, defaultValue) 方法

例如:

scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> map.getOrElse("武磊", 500000)
val res11: Int = 500000

3.2 获取所有 key

通过 keys 属性,可以获取 Map 集合中的 key 集合,这个集合为 Set 类型:

scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> map.keys
val res12: Iterable[String] = Set(夏兰特, C朗, 姆总, 美斯)

3.3 获取所有 value

通过 values 属性,可以获取 Map 集合中的 value 集合:

scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> map.values
val res13: Iterable[Int] = Iterable(150000000, 1500000, 120000000, 21000000)

3.4 遍历 Map 对象

使用 for 可以遍历 Map 对象:

scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> for((player, price) <- map) {|     println(s"${player}身价为${price}")| }
夏兰特身价为150000000
C朗身价为1500000
姆总身价为120000000
美斯身价为21000000

3.5 增加键值对并返回新的 Map

使用运算符 + 可以在原 Map 对象基础上增加新的键值对,并返回新的 Map 对象。

下面的例子,使用 + 添加了新的 (key,value),并返回新的 Map 对象,原来的 Map 对象不变:

scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> val map1 = map + ("韦世豪" -> 600000)
val map1: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000, 韦世豪 -> 600000)scala> map
val res16: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000,  美斯 -> 21000000)scala> map1
val res17: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000,  美斯 -> 21000000, 韦世豪 -> 600000)

3.6 刪除键值对

  • 使用运算符 - 可以从原 Map 对象删除指定的键值对,并返回新的 Map 对象,原来的 Map 对象不变。
scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> map - "姆总"
val res18: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 美斯 -> 21000000)scala> map
val res19: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000,  美斯 -> 21000000)
  • 如果想从 Map 对象删除指定的键值对,则可使用 remove 方法:
scala> import scala.collection.mutable.Mapscala> val map = Map("C朗"->1500000, "美斯"->21000000, "夏兰特"->150000000, "姆总"->120000000)
val map: scala.collection.mutable.Map[String, Int] = HashMap(夏兰特 -> 150000000, C朗 -> 1500000, 姆总 -> 120000000, 美 斯 -> 21000000)scala> map.remove("夏兰特")
val res22: Option[Int] = Some(150000000)scala> map
val res23: scala.collection.mutable.Map[String, Int] = HashMap(C朗 -> 1500000, 姆总 -> 120000000, 美斯 -> 21000000)

相关文章:

4 scala集合-Map

和 Java 一样&#xff0c;Scala 也有表示键值对&#xff08;Key-Value&#xff09;集合的 Map 数据结构。同样&#xff0c;Map 也分不可变和可变&#xff0c;不可变需要使用类 scala.collection.mutable.Map。 1 不可变 Map 可以使用以下语法定义不可变 Map 对象 val/var ma…...

QT 对象树模型

QObject是Qt里边绝大部分类的根类 QObject对象之间是以对象树的形式组织起来的。 当两个QObject&#xff08;或子类&#xff09;的对象建立了父子关系的时候。子对象就会加入到父对象的一个成员变量叫children&#xff08;孩子&#xff09;的list&#xff08;列表&#xff09;…...

ubuntu快速安装miniconda

ubuntu快速安装miniconda 环境 ubuntu.22.04 显卡 RTX 3050 关于选择Miniconda还是Anaconda的问题&#xff0c;Anaconda安装包比较大&#xff0c;耗时比较长&#xff0c;如果你是绝对的初学者&#xff0c;选择Anaconda会比较稳妥一些&#xff1b;否则建议你还是选择Miniconda安…...

阿里云游戏服务器多少钱一年?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…...

小游戏和GUI编程(7) | SimpleNN 界面源码解析

小游戏和GUI编程(7) | SimpleNN 界面源码解析 0. 简介 SimpleNN 是 AdamYuan 在高中一年级时用 1 天时间写出来的简易 CNN, 使用 SFML 做 UI, 用于交互式输入手写数字&#xff0c;这个数字被训练好的 CNN 网络执行推理得到识别结果, 它的运行效果如下&#xff1a; 这一篇我们…...

c++设计模式之代理模式

作用 代理模式主要用于&#xff0c;通过代理类&#xff0c;来控制实际对象的访问权限 案例 class VideoSite { public:virtual void freeVideo()0;virtual void vipVideo()0;virtual void trickVideo()0; };class FixBugVideoSite:public VideoSite { public:void freeVideo()…...

第5个-模糊加载

Day 5 - Blurry Loading 1. 项目展示 2. 分析思路 变化过程 数字从 0 不断增长到 100&#xff1b;中间的百分比数字逐渐消失&#xff0c;即透明度 opacity 从 1 到 0&#xff1b;背景图片从模糊变为清晰&#xff0c;滤镜 filter.blur()的参数设置为从 30px 到 0px。 小 tips…...

rtt设备io框架面向对象学习-adc设备

目录 1.adc设备基类2.adc设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.adc设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的adc.h定义了如下adc设备基类 struct rt_ad…...

面试官:介绍一下Exception和Error之间的区别

前言 大家好&#xff0c;我是chowley&#xff0c;在我之前的面试中&#xff0c;遇到过这样一个问题&#xff1a;Exception和Error之间有什么区别&#xff1f;今天我就来好好地总结一下&#xff01; 主体 在Java编程中&#xff0c;Exception和Error都是Java中的可抛出对象&am…...

【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了&#xff0c;明天浅浅休息一下&#xff0c;提前祝大家新年快乐捏&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; 01. 基础理解 1.1 同步调用和异步调用 &#x1f449; 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成&#xff…...

ElasticSearch之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…...

07-Java桥接模式 ( Bridge Pattern )

Java桥接模式 摘要实现范例 桥接模式&#xff08;Bridge Pattern&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化 桥接模式涉及到一个作为桥接的接口&#xff0c;使得实体类的功能独立于接口实现类&#xff0c;这两种类型的类可被结构化改变而互不影…...

golang集成sentry: go-redis

网上没有找到go-redis集成sentry的库&#xff0c; 所以我简单实现了一个 代码&#xff1a; https://github.com/Shujie-Tan/go-redis-sentry 使用方法&#xff1a; import (redis_sentry "github.com/Shujie-Tan/go-redis-sentry" ) rdb : redis.NewClient(&re…...

用EXCEL从地址(上海)中提取各区(浦东新区等区)信息

背景&#xff1a; 朋友工作需要经常用EXCEL把各上海用户收货地址中的区提取出来&#xff0c;之前一直手动处理&#xff0c;希望我帮忙用EXCEL公式直接提取处理。 数据样式&#xff1a; 中国上海市浦东新区A小区 上海徐汇区B小区 中国&#xff0c;上海&#xff0c;浦东新区&a…...

关于在分布式环境中RVN和使用场景的介绍3

简介 在《关于在分布式环境中RVN和使用场景的介绍2》和《关于在分布式环境中RVN和使用场景的介绍1》中我们介绍了RVN的概念和在一些具体用例中的使用。在本文中我们讨论一下在分布式环境中使用RVN需要注意的问题。 问题 我们在收到一条待处理的事件时&#xff0c;需要检查该…...

计算最小公倍数math.lcm()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算最小公倍数 math.lcm() 请问以下代码输出的结果是&#xff1f; import math print("【执行】math.lcm(2, 4)") print(math.lcm(2, 4)) print("【执行】math.lcm(1, 2, 3…...

VUE SEO 几种方案经典面试题

1、SSR服务器渲染 Vue.js 是构建客户端应用程序的框架。默认情况下&#xff0c;可以再浏览器中输出Vue组件&#xff0c;进行生成DOM和操作DOM。然而&#xff0c;也可以将同一个组件渲染未服务器端的HTML字符串&#xff0c;将它们直接发送到浏览器&#xff0c;最后将这些静态标…...

Python和VBA批量提取Word中的表格

表格在word文档中常见的文档元素之一。操作word文件时有时需要提取文件中多个表格的内容到一个新的文件&#xff0c;甚至有时还会要提取题注信息。 今天&#xff0c;给大家分享两种批量提取文档中表格的两种方法&#xff0c;分别是VBA法和Python法两种。 一、VBA法提取word中…...

Swift Combine 有序的异步操作 从入门到精通十二

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…...

国产航顺HK32F030M: 超声波测距模块串口通信数据接收与处理

参考代码 /************************************************************************************************** * file usart_async_tx_no_int_rx_rxneint.c * brief 异步串口通信例程, 通过查询TXE标志发送数据,通过RXNE中断接收数据,当中断接收到数据后会将 * …...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

Java多线程实现之Runnable接口深度解析

Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...

使用python进行图像处理—图像滤波(5)

图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值&#xff0c;以达到平滑&#xff08;去噪&#xff09;、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算&#xff0c;…...