映射
映射指的就是Map。它是由键值对(key, value)组成的集合。特点是: 键具有唯一性 , 但是值可以重复. 在Scala中,Map也分为不可变Map和可变Map。
注意: 如果添加重复元素(即: 两组元素的键相同), 则 会用新值覆盖旧值 .
5.1 不可变Map
不可变Map指的是元素 , 长度都不可变.
语法
- 方式一: 通过 箭头 的方式实现.
scala
val/var map = Map(键->值, 键->值, 键->值...) // 推荐,可读性更好
- 方式二: 通过 小括号 的方式实现.
scala
val/var map = Map((键, 值), (键, 值), (键, 值), (键, 值)...)
需求
- 定义一个映射,包含以下学生姓名和年龄数据: 张三 -> 23, 李四 -> 24, 李四 -> 40
- 打印结果.
参考代码
scala
//案例: 演示不可变Map
object ClassDemo19 {
def main(args: Array[String]): Unit = {
//1. 定义一个映射,包含以下学生姓名和年龄数据.
val map1 = Map("张三" -> 23, "李四" -> 24, "李四" -> 40)
val map2 = Map(("张三", 23),("李四", 24), ("李四" -> 40))
//2. 打印结果.
println(s"map1: ${map1}")
println(s"map2: ${map2}")
}
}
5.2 可变Map
特点
可变Map指的是元素,长度都可变. 定义语法与不可变Map一致, 只不过需要先手动导包:
import scala.collection.mutable.Map
需求
- 定义一个映射,包含以下学生姓名和年龄数据: 张三 -> 23, 李四 -> 24
- 修改张三的年龄为30
- 打印结果
参考代码
scala
import scala.collection.mutable.Map
//案例: 演示可变Map.
object ClassDemo20 {
def main(args: Array[String]): Unit = {
//1. 定义一个映射,包含以下学生姓名和年龄数据.
val map1 = Map("张三" -> 23, "李四" -> 24)
val map2 = Map(("张三", 23),("李四", 24))
//2. 修改张三的年龄为30
map1("张三") = 30
//3. 打印结果
println(s"map1: ${map1}")
println(s"map2: ${map2}")
}
}
5.3 Map基本操作
格式
-
map(key) : 根据键获取其对应的值, 键不存在返回None.
-
map.keys : 获取所有的键.
-
map.values : 获取所有的值.
-
遍历map集合: 可以通过普通for实现.
-
getOrElse: 根据键获取其对应的值, 如果键不存在, 则返回指定的默认值.
-
+号 : 增加键值对, 并生成一个新的Map.
注意: 如果是可变Map, 则可以通过 +=或者++= 直接往该可变Map中添加键值对元素.
- -号 : 根据键删除其对应的键值对元素, 并生成一个新的Map.
注意: 如果是可变Map, 则可以通过 -=或者--= 直接从该可变Map中删除键值对元素.
示例
- 定义一个映射,包含以下学生姓名和年龄数据: 张三 -> 23, 李四 -> 24
- 获取张三的年龄, 并打印.
- 获取所有的学生姓名, 并打印.
- 获取所有的学生年龄, 并打印.
- 打印所有的学生姓名和年龄.
- 获取 王五 的年龄,如果 王五 不存在,则返回-1, 并打印.
- 新增一个学生:王五, 25, 并打印结果.
- 将 李四 从可变映射中移除, 并打印.
参考代码
scala
import scala.collection.mutable.Map
//案例: 演示Map的常见操作.
object ClassDemo21 {
def main(args: Array[String]): Unit = {
//1. 定义一个映射,包含以下学生姓名和年龄数据: 张三 -> 23, 李四 -> 24
val map1 = Map("张三" -> 23, "李四" -> 24)
//2. 获取张三的年龄, 并打印.
println(map1.get("张三"))
//3. 获取所有的学生姓名, 并打印.
println(map1.keys)
//4. 获取所有的学生年龄, 并打印.
println(map1.values)
//5. 打印所有的学生姓名和年龄.
for((k, v) <- map1) println(s"键:${k}, 值:${v}")
println("-" * 15)
//6. 获取`王五`的年龄,如果`王五`不存在,则返回-1, 并打印.
println(map1.getOrElse("王五", -1))
println("-" * 15)
//7. 新增一个学生:王五, 25, 并打印结果.
/*//不可变Map
val map2 = map1 + ("王五" -> 25)
println(s"map1: ${map1}")
println(s"map2: ${map2}")*/
map1 += ("王五" -> 25)
//8. 将`李四`从可变映射中移除, 并打印.
map1 -= "李四"
println(s"map1: ${map1}")
}
}
迭代器(iterator)
6.1 概述
Scala针对每一类集合都提供了一个迭代器(iterator), 用来迭代访问集合.
6.2 注意事项
-
使用 iterator 方法可以从集合获取一个迭代器.
迭代器中有两个方法:
hasNext方法: 查询容器中是否有下一个元素
next方法: 返回迭代器的下一个元素,如果没有,抛出NoSuchElementException
-
每一个迭代器都是有状态的.
即: 迭代完后保留在最后一个元素的位置. 再次使用则抛出NoSuchElementException
-
可以使用while或者for来逐个获取元素.
6.3 示例
需求
- 定义一个列表,包含以下元素:1,2,3,4,5
- 使用while循环和迭代器,遍历打印该列表
参考代码
scala
//案例: 演示迭代器
object ClassDemo22 {
def main(args: Array[String]): Unit = {
//1. 定义一个列表,包含以下元素:1,2,3,4,5
val list1 = List(1, 2, 3, 4, 5)
//2. 使用while循环和迭代器,遍历打印该列表.
//2.1 根据列表获取其对应的迭代器对象.
val it = list1.iterator
//2.2 判断迭代器中是否有下一个元素.
while(it.hasNext){
//2.3 如果有, 则获取下一个元素, 并打印.
println(it.next)
}
//分割线.
println("-" * 15)
//迭代完后, 再次使用该迭代器获取元素, 则抛异常: NoSuchElementException
println(it.next)
}
}