4 scala集合-Map

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

1 不可变 Map

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

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

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

scala 复制代码
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 = 21000000

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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 = 150000000

scala> 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 elided

scala> map("武磊") = 1000000

scala> map("武磊")
val res10: Int = 1000000

3 Map 的基本操作

3.1 获取值

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

(1) 使用表达式 map(key),当 key 不存在会抛出 NoSuchElementException

(2) 使用 getOrElse(key, defaultValue) 方法

例如:

scala 复制代码
scala> import scala.collection.mutable.Map

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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 复制代码
scala> import scala.collection.mutable.Map

scala> 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)
相关推荐
重生之我在20年代敲代码30 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文32 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
serve the people35 分钟前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
编程零零七3 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286114 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py4 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy4 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond5 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
罗政6 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
迷迭所归处6 小时前
C++ —— 关于vector
开发语言·c++·算法