在 Scala 编程中,集合 (Collection) 是我们日常开发中最常用的数据结构之一。今天,我们将通过一个图书馆书籍管理的实例,来深入学习 Scala 中可变 Map的各种操作方法。
什么是可变 Map?
在 Scala 中,Map 是一种键值对 (key-value) 的集合。可变 Map (mutable.Map) 允许我们直接修改其内容,包括添加、删除、更新元素,而不需要创建新的 Map 实例。这在需要频繁修改数据的场景下非常适用。
实战演练:图书馆书籍管理系统
1. 创建并初始化可变 Map
首先,我们创建一个可变 Map 来存储图书馆的书籍信息。键为书籍编号 (String 类型),值为包含书籍名称、作者和库存数量的元组。
import scala.collection.mutable
object LibraryManager {
def main(args: Array[String]): Unit = {
// 创建一个可变Map,用于存储书籍信息
val library: mutable.Map[String, (String, String, Int)] = mutable.Map(
"BK001" -> ("《Scala编程》", "Martin Odersky", 5),
"BK002" -> ("《深入理解Java虚拟机》", "周志明", 3),
"BK003" -> ("《算法导论》", "Thomas H. Cormen", 2)
)
println("初始化后的图书馆藏书:")
printLibrary(library)
}
// 辅助方法:打印图书馆所有书籍信息
def printLibrary(library: mutable.Map[String, (String, String, Int)]): Unit = {
library.foreach { case (id, (name, author, stock)) =>
println(s"编号:$id, 书名:$name, 作者:$author, 库存:$stock")
}
println("-" * 50)
}
}
2. 添加新书籍
使用+=操作符,我们可以轻松地向 Map 中添加新的键值对:
// 添加两本新的书籍
library += ("BK004" -> ("《Effective Java》", "Joshua Bloch", 4))
library += ("BK005" -> ("《Python编程:从入门到实践》", "Eric Matthes", 6))
println("添加新书后的图书馆藏书:")
printLibrary(library)
3. 根据书籍编号查询信息
使用get方法可以安全地查询 Map 中的元素,它会返回一个Option类型,避免了空指针异常:
// 查询特定书籍信息
val bookIdToFind = "BK002"
library.get(bookIdToFind) match {
case Some((name, author, stock)) =>
println(s"找到书籍:编号:$bookIdToFind, 书名:$name, 作者:$author, 库存:$stock")
case None =>
println(s"未找到编号为 $bookIdToFind 的书籍")
}
println("-" * 50)
4. 修改书籍库存数量
可变 Map 的一大优势就是可以直接修改其值。由于元组是不可变的,我们需要用新的元组替换旧的:
// 修改某本书的库存数量(假设BK001又购入了3本)
val bookIdToUpdate = "BK001"
library.get(bookIdToUpdate).foreach { case (name, author, stock) =>
library(bookIdToUpdate) = (name, author, stock + 3)
}
println("修改库存后的图书馆藏书:")
printLibrary(library)
5. 删除书籍
使用-=操作符可以从 Map 中删除指定键的元素:
// 删除一本书(假设BK003已经下架)
library -= "BK003"
println("删除书籍后的图书馆藏书:")
printLibrary(library)
6. 遍历 Map
我们可以通过多种方式遍历 Map,最常用的是使用foreach结合模式匹配:
// 遍历并打印所有书籍信息(另一种写法)
println("最终图书馆藏书清单:")
for ((id, (name, author, stock)) <- library) {
println(f"[$id] $name - $author (库存:$stock%2d本)")
}
完整运行结果
初始化后的图书馆藏书:
编号:BK001, 书名:《Scala编程》, 作者:Martin Odersky, 库存:5
编号:BK002, 书名:《深入理解Java虚拟机》, 作者:周志明, 库存:3
编号:BK003, 书名:《算法导论》, 作者:Thomas H. Cormen, 库存:2
--------------------------------------------------
添加新书后的图书馆藏书:
编号:BK001, 书名:《Scala编程》, 作者:Martin Odersky, 库存:5
编号:BK002, 书名:《深入理解Java虚拟机》, 作者:周志明, 库存:3
编号:BK003, 书名:《算法导论》, 作者:Thomas H. Cormen, 库存:2
编号:BK004, 书名:《Effective Java》, 作者:Joshua Bloch, 库存:4
编号:BK005, 书名:《Python编程:从入门到实践》, 作者:Eric Matthes, 库存:6
--------------------------------------------------
找到书籍:编号:BK002, 书名:《深入理解Java虚拟机》, 作者:周志明, 库存:3
--------------------------------------------------
修改库存后的图书馆藏书:
编号:BK001, 书名:《Scala编程》, 作者:Martin Odersky, 库存:8
编号:BK002, 书名:《深入理解Java虚拟机》, 作者:周志明, 库存:3
编号:BK003, 书名:《算法导论》, 作者:Thomas H. Cormen, 库存:2
编号:BK004, 书名:《Effective Java》, 作者:Joshua Bloch, 库存:4
编号:BK005, 书名:《Python编程:从入门到实践》, 作者:Eric Matthes, 库存:6
--------------------------------------------------
删除书籍后的图书馆藏书:
编号:BK001, 书名:《Scala编程》, 作者:Martin Odersky, 库存:8
编号:BK002, 书名:《深入理解Java虚拟机》, 作者:周志明, 库存:3
编号:BK004, 书名:《Effective Java》, 作者:Joshua Bloch, 库存:4
编号:BK005, 书名:《Python编程:从入门到实践》, 作者:Eric Matthes, 库存:6
--------------------------------------------------
最终图书馆藏书清单:
[BK001] 《Scala编程》 - Martin Odersky (库存: 8本)
[BK002] 《深入理解Java虚拟机》 - 周志明 (库存: 3本)
[BK004] 《Effective Java》 - Joshua Bloch (库存: 4本)
[BK005] 《Python编程:从入门到实践》 - Eric Matthes (库存: 6本)