Scala中的Map集合
1. Map集合
1.1 Scala中的Map介绍
Scala中的Map 和Java类似,也是一个散列表,它存储的内容也是键值对(key-value)映射,Scala中不可变的Map是有序的,可变的Map是无序的。
Scala中,有可变Map (scala.collection.mutable.Map) 和 不可变Map(scala.collection.immutable.Map)
1.2 构建map
- 构建不可变map
Scala中的不可变Map是有序,构建Map中的元素底层是Tuple2类型。
val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
- 不可变map,输出顺序和声明顺序一致
- 构建Map集合中,集合中的元素其实是Tuple2类型
- 默认情况下(即没有引入其它包的情况下),Map是不可变map
- 构建可变map //需要指定可变Map的包
val map2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> 30)
说明:可变map输出顺序和声明顺序不一致
- 构建空map
val map3 = new scala.collection.mutable.HashMap[String, Int]
- 使用对偶元组,构建map
即创建包含键值对的二元组, 和第一种方式等价,只是形式上不同而已。对偶元组 就是只含有两个数据的元组。
val map4 = mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30) )
1.3 Map操作
- 添加map元素
方式1-增加单个元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
map4 += ( "D" -> 4 )
map4 += ( "B" -> 50 )
println(map4)
思考:如果增加的key 已经存在会怎么样?
如果在添加元素的时候,对应的key已经存在,则会更新key所对应的value值。
- 方式2-增加多个元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
val map5 = map4 + ("E"->1, "F"->3)
map4 += ("EE"->1, "FF"->3)
- 删除map元素
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
map4 -= ("A", "B")
println("map4=" + map4)
说明
- "A","B" 就是要删除的key, 可以写多个.
- 如果key存在,就删除,如果key不存在,也不会报错.
1.4 Map取值
- 方式1-使用map(key)
val value1 = map2("Alice")
println(value1)
说明:
- 如果key存在,则返回对应的值
- 如果key不存在,则抛出异常[java.util.NoSuchElementException]
- 在Java中,如果key不存在则返回null
- 方式2-使用contains方法检查是否存在key
// 返回Boolean
// 1.如果key存在,则返回true
// 2.如果key不存在,则返回false
map4.contains("B")
说明:使用containts先判断在取值,可以防止异常,并加入相应的处理逻辑
val map4 = mutable.Map( ("A", 1), ("B", 2), ("C", 3),("D", 30.9) )
if( map4.contains("B") ) {
println("key存在值= " + map4("B"))
} else {
println("key不存在")
}
- 方式3-使用map.get(key).get取值
通过调用“.get”方法,返回一个Option对象,要么是Some,要么是None
var map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
println(map4.get("A")) //Some
println(map4.get("A").get) //得到Some在取出
说明和小结:
- map.get方法会将数据进行包装
- 如果 map.get(key) key存在返回some,如果key不存在,则返回None
- 如果 map.get(key).get key存在,返回key对应的值,否则,抛出异常java.util.NoSuchElementException: None.get
- 方式4-使用map4.getOrElse()取值
getOrElse 方法 : def getOrElse[V1 >: V](key: K, default: => V1)
说明:
- 如果key存在,返回key对应的值。
- 如果key不存在,返回默认值。在java中底层有很多类似的操作。
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
println(map4.getOrElse("A","默认"))
- 取值方式选择建议
- 若能确定map有key ,使用map(key), 速度快
- 若不能确定map是否有key ,而且有不同的业务逻辑,使用map.contains() ,先判断再加入逻辑
- 若只是得到一个值,使用map4.getOrElse("ip","127.0.0.1")
1.5 更新Map
val map4 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
map4("AA") = 20
println(map4)
- map 是可变的,才能修改,否则报错
- 如果key存在:则修改对应的值,key不存在,等价于添加一个key-value
1.6 Map遍历
val map1 = mutable.Map( ("A", 1), ("B", "北京"), ("C", 3) )
for ((k, v) <- map1) println(k + " is mapped to " + v)//模式匹配的方式
for (v <- map1.keys) println(v)//打印Key
for (v <- map1.values) println(v)//打印value
for(v <- map1) println(v) //v是Tuple
说明
1.每遍历一次,返回的元素是Tuple2
2.取出的时候,可以按照元组的方式来取
1.7 综合应用实例
object MapDemo01 {
def main(args: Array[String]): Unit = {
//方式1-构造不可变映射
//1.默认Map是 immutable.Map
//2.key-value 类型支持Any
//3.在Map的底层,每对key-value是Tuple2
//4.从输出的结果看到,输出顺序和声明顺序一致
val map1 = Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
println(map1)
//方式2-构造可变映射
//1.从输出的结果看到,可变的map输出顺序和声明顺序不一致
val map2 = mutable.Map("Alice" -> 10, "Bob" -> 20, "Kotlin" -> "北京")
println(map2)
//方式3-创建空的映射
val map3 = new scala.collection.mutable.HashMap[String, Int]
println("map3=" + map3)
//方式4-对偶元组
val map4 = mutable.Map(("Alice", 10), ("Bob", 20), ("Kotlin", "北京"))
println("map4=" + map4)
map4 += ( "D" -> 4 )
map4 += ( "B" -> 50 )
println("map4=" +map4)
//方式1-使用map(key)
println(map4("Alice")) // 10
//抛出异常(java.util.NoSuchElementException: key not found:)
//println(map4("Alice~"))
//方式2-使用contains方法检查是否存在key
if (map4.contains("Alice")) {
println("key存在,值=" + map4("Alice"))
} else {
println("key不存在:)")
}
//方式3 方式3-使用map.get(key).get取值
//1. 如果key存在 map.get(key) 就会返回Some(值) ,然后Some(值).get就可以取出
//2. 如果key不存在 map.get(key) 就会返回None
println(map4.get("Alice").get)
//println(map4.get("Alice~").get) // 抛出异常
//方式4-使用map4.getOrElse()取值
println(map4.getOrElse("Alice~~~", "默认的值 鱼 <・)))><<"))
val map5 = mutable.Map(("A", 1), ("B", "北京"), ("C", 3))
map5("A") = 20 //增加
println("map5=" + map5)
map5 += ("A" -> 100)
println("map5=" + map5)
val mapVar = map5 + ("E"->1, "F"->3)
println("mapVar=" + mapVar)
map5 += ("GG"->1, "HH"->3)
println("map5=" + map5)
map5 -= ("A", "B", "AAA") //
println("map5=" + map5)
//map的遍历
val map6 = mutable.Map(("A", 1), ("B", "北京"), ("C", 3))
println("----(k, v) <- map6--------")
for ((k, v) <- map6) println(k + " is mapped to " + v)
println("----v <- map6.keys--------")
for (v <- map6.keys) println(v)
println("----v <- map6.values--------")
for (v <- map6.values) println(v)
//这样取出方式 v 类型是 Tuple2
println("----v <- map6--------")
for (v <- map6) println(v + " key =" + v._1 + " val=" + v._2) //v是Tuple?
val map7 = mutable.Map(("Alice", 10), ("Bob", 20), ("Kotlin", "北京"))
val map8 = mutable.Map(("A", 1), ("B", "北京"), ("C", 3))
map7 ++= map8
println("map7=" + map7) //map7=Map(Bob -> 20, A -> 1, Kotlin -> 北京, C -> 3, Alice -> 10, B -> 北京)
val map9=map7 ++ map8
println("map9=" + map9) //map9=Map(Bob -> 20, Kotlin -> 北京, A -> 1, C -> 3, Alice -> 10, B -> 北京)
}
}
Scala中的Map集合的更多相关文章
- Scala中的Map使用例子
Map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于Spark的底层语言是Scala,所以有必要来了解下Scala中的Map使用方法. (1)不可变Map特点: api不太丰富 如果是 ...
- Scala中的Map
映射 映射是对偶的集合. 声明映射 映射是对偶的集合. a.声明映射 b.映射中的键值对称作对偶,用( , )表示 c.当映射中不存在key时,取值会报错,解决方案是使用 contains方法,或者g ...
- 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合
package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...
- java中的Map集合
Map接口 Map为一个接口.实现Map接口的类都有一个特点:有键值对,将键映射到值的对象. Map不能包含重复的键,每个键可以映射到最多一个值. Map常见的接口方法有: V put(K key, ...
- 【mybatis】mybatis中 返回map集合
关于mybatis返回map集合的操作: 1.mapper.xml中写一个查询返回map的sql <select id="findMap" parameterType=&qu ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- ES6中的Map集合(与java里类似)
Set类型可以用来处理列表中的值,但是不适用于处理键值对这样的信息结构.ES6也添加了Map集合来解决类似的问题 一.Map集合 JS的对象(Object),本质上是键值对的集合(Hash结构),但是 ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- scala中获取Map中key和value的方法
val scores=Map("Alice"->10,"Bob"->3,"Cindy"->8) // 获取所有的key v ...
随机推荐
- 多云架构下,JAVA微服务技术选型实例解析
[摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...
- pandas之Seris和DataFrame
pandas是一个强大的python工具包,提供了大量处理数据的函数和方法,用于处理数据和分析数据. 使用pandas之前需要先安装pandas包,并通过import pandas as pd导入. ...
- Button基本用语
1.self.btn2 = Button(root,image = photo,command = self.login) 使用 image 图片作为按钮,command 作为响应 2.self.bt ...
- 使用SQL实现数据操作
SQL和RDBMS的区别:用SQL操作RDBMS 一.数据的完整性 一个汉字占多少长度与编码有关: UTF-8:一个汉字=3个字节 GBK:一个汉字=2个字节 二.数据库基本操作 1. 登录数据库 首 ...
- luogu P1128 [HNOI2001]求正整数 dp 高精度
LINK:求正整数 比较难的高精度. 容易想到贪心不过这个贪心的策略大多都能找到反例. 考虑dp. f[i][j]表示前i个质数此时n的值为j的最小的答案. 利用高精度dp不太现实.就算上FFT也会T ...
- bzoj 2225 [Spoj 2371]Another Longest Increasing
这道题 连续上升的三元组 且已经按照第一维排好序了. 直接上CDQ分治即可 当然也是可以2-Dtree解决这个 问题 但是感觉nlog^2 比nsqrt(n)要快一些.. 算是复习一发CDQ分治吧 也 ...
- 解析Class文件
类文件解析的入口是ClassFileParser类中定义的parseClassFile()方法.上一小节得到了文件字节流stream后,接着会在ClassLoader::load_classfile( ...
- 基于asp.net core 从零搭建自己的业务框架(三)
前言 根据业务处理部分,单体马上就能得知错误与否,快速做出处理,而分布式系统,会因为各种原因,无法如同单体一样立刻处理,所以这个时候需要 处理异常 的,做 补偿.转移.人工干预. 当然也可以直接在消费 ...
- java交换两个参数值的四种方法
第一种:添加中间变量,算是最经典最简易的一种了. //添加一个中间变量 int x = 1, y = 2; int z; z = x;x = y;y = z; System.out.println(x ...
- “随手记”开发记录day14
今天继续昨天没有完成的增加“修改”功能.对于已经添加的记账记录,长按可以进行修改和删除的操作. 但是今天并没有完成……