Scala009--Scala中的数据结构【映射】

news2025/7/26 7:55:35

目录

一,概述

二,map的声明

1,不可变map

三,HashMap的声明

1,可变hashmap

四,map常用函数

1,查看map中的元素个数  size

2,获取map集合中key对应的value值

1)使用小括号的形式

2)使用get函数的形式

 3)使用getOrElse函数

 4)向map集合中添加key,value    [ +(key -> value)]

5)删除集合中key键对应的值value     [-(key)]

6)数据类型强转   .asInstanceOf[数据类型]

 7)同类序列的拼接   ++

8)判断映射是否为空  isEmpty

​编辑

 五,hashmap常用函数

 1,向可变映射中添加元素  【put(key,value)】

2,从可变映射中删除元素   [remove(key)]

 3,使用+=函数添加多个元素

4,使用-=函数删除多个元素 

六,映射的遍历 

1,获取映射中的key    【keySet函数/keys函数】

 2,获取映射中的键值对  【不使用函数】 

 3,获取映射中的value值  【values函数】

七,将对偶的序列转换成map映射  【toMap函数】

1,将含有对偶元组的数组转换成映射

 2,将含有对偶元组的列表转换成map映射


 

一,概述

Scala中的映射其实就是map集合,它的使用和Java中的map一样,但是在Scala中它依旧和之前的几种数据结构:列表,数组,集合一样,有着两种形式,一种是可变的map,另外一种是不可变的map。接下来我们先来认识不可变的map。

二,map的声明

在Scala中,map和set一样,虽然是个接口,但是依旧可以直接使用它创建一个数据。

1,不可变map

scala> val map_im=Map("张三" -> "一等奖","李四" ->("二等奖","特等奖"))  // 声明一个不可变map集合
map_im: scala.collection.immutable.Map[String,java.io.Serializable] = Map(张三 -> 一等奖, 李四 -> (二等奖,特等奖))

 如上,我们可以看到,在声明map集合的时候,不同于数组,列表,集合,它需要传入两个值,key  -> value,并且,如果value比较多的话可以使用小括号包裹起来。

对于不可变的map来说,它的元素是不可以改变的,如下,当我们试图去修改map中key对应的value值时就会报错:

 error: value update is not a member of

scala.collection.immutable.Map[String,java.io.Serializable]

三,HashMap的声明

1,可变hashmap

我们在使用可变的映射hashmap的时候需要导入相关的包才行,不然就会报错,并告诉我们找不到该类型:

 当我们导入包之后:import scala.collection.mutable.HashMap。

再去使用动态和静态的方法创建映射就可以成功:

scala> import scala.collection.mutable.HashMap  // 导入可变的hashmap
import scala.collection.mutable.HashMap

scala> val  map_hash=HashMap("北京" -> "10k")
map_hash: scala.collection.mutable.HashMap[String,String] = Map(北京 -> 10k)

scala> val ma_hash1=new HashMap[String,Int]  // 动态创建hashmap映射
ma_hash1: scala.collection.mutable.HashMap[String,Int] = Map()

 可变的hashmap和之前的可变列表,可变数组都一样,有很多的可用函数用于对数据结构中的数据更改。如put函数用于添加数据,remove函数用于删除等。

四,map常用函数

1,查看map中的元素个数  size

size函数很通用,在Scala中的其他数据结构中,如数组,列表,集合,查看元素个数都可以使用size函数来进行查看。

scala> val map_im=Map("张三" -> "一等奖","李四" ->("二等奖","特等奖"))  // 声明一个不可变map集合
map_im: scala.collection.immutable.Map[String,java.io.Serializable] = Map(张三 -> 一等奖, 李四 -> (二等奖,特等奖))

scala> map_im.size
res0: Int = 2

 如上,在map集合中使用size函数返回map集合中的元素个数即map集合中的key。

2,获取map集合中key对应的value值

1)使用小括号的形式

scala> map_im
res1: scala.collection.immutable.Map[String,java.io.Serializable] = Map(张三 -> 一等奖, 李四 -> (二等奖,特等奖))

scala> map_im("张三")  // 获取张三的信息,如果有则返回,没有相应的key则报错
res2: java.io.Serializable = 一等奖

scala> map_im("王五")   // map集合中没有的key
java.util.NoSuchElementException: key not found: 王五
  at scala.collection.immutable.Map$Map2.apply(Map.scala:184)
  ... 28 elided

scala>

  如上 ,我们可以看到,当我们使用小括号的形式去获取map集合中没有key键对应的value值的时候会给我们报错,但是有些时候我们不想要这种报错(看起来怪难看的),这个时候就需要使用另外两种不同的函数来解决这种问题。我们接着看:

2)使用get函数的形式

get函数返回的值只有两种,一种是找到有key的value值:some(value/values),另外一种就是找不到的:none,如下:

返回none


scala> map_im("王五")   // map集合中没有的key
java.util.NoSuchElementException: key not found: 王五
  at scala.collection.immutable.Map$Map2.apply(Map.scala:184)
  ... 28 elided

scala> map_im
res9: scala.collection.immutable.Map[String,java.io.Serializable] = Map(张三 -> 一等奖, 李四 -> (二等奖,特等奖))

scala> map_im.get("王五")
res10: Option[java.io.Serializable] = None

返回some 

scala> map_im.get("张三")
res0: Option[java.io.Serializable] = Some(一等奖)

当找不到的时候如果不想只返回none结果,还想要再返回相应的提示,那么我们就可以使用getOrElse函数,里面可以传入两个参数。 

 3)使用getOrElse函数

getOrElse函数,里面需要传入两个参数,第一个是要查找的key对应的value值,第二个是如果找不到对应的value值则返回自定义的返回,如下,我们查找存在的张三和不存在的王五:


scala> map_im.getOrElse("张三","抱歉该选手未注册")
res2: java.io.Serializable = 一等奖

scala> map_im.getOrElse("王五","抱歉该选手未注册")
res3: java.io.Serializable = 抱歉该选手未注册

 4)向map集合中添加key,value    [ +(key -> value)]

对于不可变map映射来说,添加或者是减去任何元素都不会对原有的集合产生任何影响,但是我们可以使用新的变量来接收产生的集合结果。

不可变map集合中添加元素:

scala> map_im + ("张三壹号" -> 19)
res10: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20, 张三壹号 -> 19)

scala> map_im
res11: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20)

 如上,我们向map_im集合中添加元素之后再去查看该集合,就会发现该集合中没有添加“张三壹号”相应的key和value。

5)删除集合中key键对应的值value     [-(key)]

不可变map集合中删除元素:

删除map映射中的元素只需要给定一个key即可,不用像之前添加函数那样需要写两个参数。

scala> map_im
res11: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20)

scala> map_im -("张三")
res12: scala.collection.immutable.Map[String,Int] = Map(李四 -> 20)

scala> map_im
res13: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20)

6)数据类型强转   .asInstanceOf[数据类型]

scala> map_im("张三").asInstanceOf[Double]  //   将int类型的数据强转为double类型
res14: Double = 18.0

scala> map_im("张三")
res15: Int = 18

 7)同类序列的拼接   ++

scala> val map_im1=Map("赵六" -> 100)
map_im1: scala.collection.immutable.Map[String,Int] = Map(赵六 -> 100)

scala> map_im
res16: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20)

scala> // 使用++ 对两个同类的序列进行拼接

scala> map_im ++ map_im1
res17: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20, 赵六 -> 100)

8)判断映射是否为空  isEmpty

 isEmpty函数不需要传入参数,返回值只有两种:①如果为空则返回true②如果不为空则返回false

scala> map_im
res43: scala.collection.immutable.Map[String,Int] = Map(张三 -> 18, 李四 -> 20)

scala> map_im.isEmpty
res44: Boolean = false

 五,hashmap常用函数

 1,向可变映射中添加元素  【put(key,value)】

当在可变映射中进行添加或者是删除操作的时候,都会对原来的数据结构造成影响。如下我们使用put函数向一个没有数据的hashmap映射中添加元素,之后再去查看该数据结构就会发现多了一对key,value值。

scala> // 使用put方法向可变hashmap中添加元素

scala> ma_hash1.put("上海",11000)
res21: Option[Int] = None

scala> ma_hash1
res22: scala.collection.mutable.HashMap[String,Int] = Map(上海 -> 11000)

如上,我们可以看到,添加成功之后会有一个返回值:none, 这个不用管,表示我们的添加是成功的,并且还是第一次添加。如果是向hashmap映射中添加已经存在的键值对的话就会是另外一种输出:

如上,当第二次去添加的话就会返回映射中已经存在的键值对。 

2,从可变映射中删除元素   [remove(key)]

remove函数只需要我们向里面传入一个参数,那就是想要删除的key。如下,我们使用remove函数删除ma_hash1映射中的"上海"所对应的键和值:


scala> ma_hash1
res35: scala.collection.mutable.HashMap[String,Int] = Map(上海 -> 11000, 珠海 -> 3333, 广州 -> 3, 深圳 -> 33333)

scala> ma_hash1.remove("上海")
res36: Option[Int] = Some(11000)

scala> ma_hash1
res37: scala.collection.mutable.HashMap[String,Int] = Map(珠海 -> 3333, 广州 -> 3, 深圳 -> 33333)

 如上,当我们使用remove函数去删除键值对的时候就会发现它会将值返回来,不得不说挺人性化的。

 3,使用+=函数添加多个元素

上面我们知道了put函数,并用它来为hashmap可变映射添加了键值对,但是它也有局限性,一次性只能够加入一对键值对,但是如果使用+=函数的话一次性可以加入多个键值对:


scala> ma_hash1 +=("广州" ->3)
res32: ma_hash1.type = Map(上海 -> 11000, 广州 -> 3)

scala> ma_hash1 +=(("深圳" -> 33333),"珠海" -> 3333)
res33: ma_hash1.type = Map(上海 -> 11000, 珠海 -> 3333, 广州 -> 3, 深圳 -> 33333)

但是当我们使用了put函数的时候就不能够像+=函数这样一次性可以添加多个键值对,如下就会报错:

4,使用-=函数删除多个元素 

和+=函数的使用一样,也可以一次性对多个元素进行操作,只需要传入key键即可:

scala> ma_hash1
res37: scala.collection.mutable.HashMap[String,Int] = Map(珠海 -> 3333, 广州 -> 3, 深圳 -> 33333)

scala> ma_hash1 -=("广州","珠海")
res38: ma_hash1.type = Map(深圳 -> 33333)

六,映射的遍历 

1,获取映射中的key    【keySet函数/keys函数】

不管是列表还是数组的遍历都离不开for循环,我们的映射也不例外,只是我们在遍历映射的时候并不是通过下标遍历,而是使用keySet方法来获取映射对应的key键,之后我们再使用得到的key去访问value值,如下:

scala> map_hash
res47: scala.collection.mutable.HashMap[String,String] = Map(上海 -> 11k, 北京 -> 10k, 广州 -> 12k)


scala> for(k <- map_hash.keySet)println(s"key:${k},value:${map_hash(k)}") // 遍历map映射
key:上海,value:11k
key:北京,value:10k
key:广州,value:12k

scala> for(key <- map_hash.keys)println(s"key:${key},value:${map_hash(key)}")  // 使用keys方法
key:上海,value:11k
key:北京,value:10k
key:广州,value:12k

 从上面我们可以看到keySet和keys函数都是一样的,用于获取映射中的key键。

 2,获取映射中的键值对  【不使用函数】 

如果不想要像上面那样只想要直接一次性获取到key,而是key和value都想要同时遍历到的话可以让两个变量来存储映射中的键值对即可,如下:

scala> for((key,value) <- map_hash)println(s"key:${key},value:${value}")  // 不使用函数
key:上海,value:11k
key:北京,value:10k
key:广州,value:12k

 3,获取映射中的value值  【values函数】

如果只想要获取映射中的value值的话可以直接使用values函数得到,如下:

scala> for(value <- map_hash.values)println(s"value:${value}")
value:11k
value:10k
value:12k

scala> map_hash
res60: scala.collection.mutable.HashMap[String,String] = Map(上海 -> 11k, 北京 -> 10k, 广州 -> 12k)

七,将对偶的序列转换成map映射  【toMap函数】

1,将含有对偶元组的数组转换成映射

对偶数组的形成有两种,一种是自己声明定义出来的,另外一种就是两个数组就行zip拉链形成。现在我们先使用两个数组进行zip拉链形成对偶数组,并使用toMap函数转换成map映射

scala> val arr_im=Array(1,2,3)  //  静态声明不可变数组
arr_im: Array[Int] = Array(1, 2, 3)

scala> val arr_im1=Array(5,6,7)
arr_im1: Array[Int] = Array(5, 6, 7)

scala> val  zip_arrT=arr_im zip arr_im1   // 使用zip函数将两个数组进行拉链,形成对偶数组
zip_arrT: Array[(Int, Int)] = Array((1,5), (2,6), (3,7))

scala> zip_arrT.toMap     // 将对偶数组转换成map映射
res61: scala.collection.immutable.Map[Int,Int] = Map(1 -> 5, 2 -> 6, 3 -> 7)

 直接声明定义一个对偶数组,并使用toMap函数转换成map映射

scala> val t_arr= Array((1,5), (2,6), (3,7))  // 声明定义一个对偶数组数据
t_arr: Array[(Int, Int)] = Array((1,5), (2,6), (3,7))

scala> t_arr.toMap  // 使用toMap函数将对偶数组转换成map映射
res63: scala.collection.immutable.Map[Int,Int] = Map(1 -> 5, 2 -> 6, 3 -> 7)

 2,将含有对偶元组的列表转换成map映射


scala> val list=List(("a",1),("b",1))  // 对偶列表
list: List[(String, Int)] = List((a,1), (b,1))

scala> list.toMap
res62: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 1)

有问题请在评论区留言。

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

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

相关文章

react源码中的hooks

今天&#xff0c;让我们一起深入探究 React Hook 的实现方法&#xff0c;以便更好的理解它。但是&#xff0c;它的各种神奇特性的不足是&#xff0c;一旦出现问题&#xff0c;调试非常困难&#xff0c;这是由于它的背后是由复杂的堆栈追踪&#xff08;stack trace&#xff09;支…

更新后的python seaborn用于科研图绘

python seaborn 0.12 数据科学和科研绘图的人离不开R的ggplot2&#xff0c;尽管python已经有了诸如matplotlib、seaborn等强大绘图包&#xff0c;兼有basemap、cartopy等空间数据可视化能力&#xff0c;但相较于R的ggplot&#xff0c;总感觉欠缺了点东西。 前不久seaborn更新…

Ubuntu系统安装

一、制作启动盘 首先格式化U盘&#xff0c;格式选NTFS 制作启动盘&#xff0c;这里使用的是ultraISO&#xff0c;也是使用最多的方式。 打开文件&#xff0c;选中下载好的镜像iso文件。 启动 -> 写入硬盘映像 选择自己的U盘&#xff0c;写入方式选择 USB-HDD&#xff0c;隐…

进程地址空间详解

文章目录空间布局图首先有一个问题&#xff0c;我们曾经学过的程序地址空间是内存吗&#xff1f;&#xff1f;&#xff1f;为什么fork()会返回两个值先来看一下一个代码的现象在这里插入图片描述在C/C中我们看到的地址是物理地址吗&#xff1f;为什么操作系统不让我直接看到物理…

SpringBoot整合RabbitMQ

RabbitMQ安装部署详情可见&#xff1a;RabbitMQ简介及在Linux中安装部署&#xff08;yum&#xff09; 一、导入pom.xml依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</versio…

简单的抓包

验证TCP/IP协议栈结构、帧结构 准备&#xff1a; 用到的软件&#xff1a;科来网络分析系统、putty 1&#xff09;准备两台虚拟机&#xff08;我这里准备windows2003、7&#xff09;&#xff0c;并让两台虚拟机可以互相通信&#xff08;配置IP&#xff0c;让他们处于同一局域网…

基于SSM的网络教学(作业)管理系统

1、项目介绍 基于SSM的网络教学&#xff08;作业&#xff09;管理系统拥有三种角色&#xff1a;管理员、教师和学生 管理员&#xff1a;教师管理、学生管理、课程管理、教学信息管理、作业管理、试卷管理、试题管理、论坛管理、系统管理、考试管理等 教师&#xff1a;课程信…

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手

【快速上手系列】使用支付宝沙箱环境进行支付测试的快速上手 步骤 一、支付宝开放平台 1、进入支付宝开放平台&#xff0c;登录&#xff0c;然后点击控制台&#xff0c;划到最下面&#xff0c;点击沙箱 2、APPID一会要用到&#xff0c;然后将接口加签方式选择为自定义密钥&a…

【Bio】基础生物学 - 细胞膜 cell membrane

文章目录1. 细胞膜1.1 内平衡1.2 选择透过性1.3 流动镶嵌模型Ref1. 细胞膜 没有细胞膜&#xff0c;就没有细胞。 不论是否有细胞壁&#xff0c;所有的细胞都有细胞膜&#xff0c;也叫做 质膜 (plasma membrane)\blue{\text{质膜 (plasma membrane)}}质膜 (plasma membrane)。…

RabbitMQ系列【10】死信队列

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录概念创建死信交换机、队列过期导致死信拒接消费长度限制概念 无法被消费的消息被称为死信&#xff0c;存放死信的队列也就是死信队列。 由于某些特定的原因导致队列中的某些消息无法被消费&am…

【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ********…

Mac 通过docker安装MinIO

前言 最近MeterSphere出了新版本&#xff0c;新版本架构是这样的&#xff08;如下图&#xff09;。采用了SpringCloudSpringBoot 微服务的架构的。跟以往相比&#xff0c;多了一个新的组件&#xff0c;MinIO。也就是分布式存储。 关于MinIO 1、MinIO是什么&#xff1f; 官方…

[附源码]java毕业设计某互联网公司人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C语言】操作符详解

目录 1、操作符分类 2、算术操作符 3、移位操作符 (二进制) 3.1 左移操作符 3.2 右移操作符 4、位操作符 5、赋值操作符 6、单目操作符 6.1 单目操作符介绍 6.2 sizeof和数组 7、关系操作符 8、逻辑操作符 9、条件操作符 10、逗号表达式 11、下标引用、函…

微信对账单功能开发(V2)

下载交易账单接口开发 应用场景&#xff1a; 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致&#xff0c;通过对账单核对后可校正支付状态。 注意&#xff1a; 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易…

Azure Integrator Delphi版

Azure Integrator Delphi版 Azure Integrator包括表、队列和Blob等标准Windows Azure结构的实现&#xff0c;使开发人员能够快速轻松地将基于云的数据存储、队列管理、表配置等添加到任何桌面、Web或移动应用程序中。 Azure Integrator功能 用于访问Windows Azure表、Blob和队列…

python folium 实现地图平台制作

python实现泸定地震点观测平台制作 数据来自[走天涯徐小洋地理数据科学]&#xff0c;原始数据来自微博中国地震台网 的正式测定数据。 以下是地震点的数据&#xff1a; MagnitudeDateTimeLongitudeLatitudeDepth6.82022-9-512:52102.0829.59163.12022-9-65:28102.0729.64113…

[附源码]java毕业设计览宏公司会议管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

01. 信息搜集:Web 1~10

Web 1~10web1知识点题解web2知识点题解web3知识点题解web4知识点题解web5知识点题解web6知识点题解web7知识点题解web8知识点题解web9知识点题解web10知识点题解web1 知识点 查看网页源码&#xff1a;ctrl u 或 F12 开发注释未及时删除 题解 查看网页源码即可。 web2 知识…

学习UI设计,哪些软件是必学的

UI设计软件的学习并不重要。许多设计软件功能相似&#xff0c;操作相似&#xff0c;设计效果相似&#xff0c;此时我们只需要选择相同类型的软件进行深入学习&#xff0c;当我们掌握软件时&#xff0c;使用其他类型的软件基本上不会有太大的困难。 ​一、位图软件&#xff1a; …