Scala的Map映射

74 阅读5分钟

(一)Map 的定义和创建

Map是一种存储键值对的数据结构,每个键在 Map 中是唯一的。在 Scala 中,我们可以使用多种方式创建 Map。

Map 创建格式:

1.不可变 Map:val mapName: Map[KeyType, ValueType] = Map(key1 -> value1, key2 -> value2,...)

2.可变 Map(需导入scala.collection.mutable.Map):val mapName : mutable.Map[KeyType, ValueType] = mutable.Map(key1 -> value2,...)

注: 不可变 Map 创建后不能修改,而可变 Map 可以进行添加、删除等操作。

/*
* Map 映射 表示一种一一对应的关系!
* */
object map01 {
  def main(args: Array[String]): Unit = {
    //创建可变的Map 键值对
    val scores = scala.collection.mutable.Map("fairy" -> 100,"不娜娜" -> 80)
    //添加
    scores += ("max" -> 95)
    println(scores)

    //创建不可变得Map
    val provinceInfo = scala.collection.mutable.Map("42" -> "湖北")
    //添加
    val newInfo = provinceInfo + ("14" -> "山西")
    println(newInfo)
  }
}

//运行结果:
HashMap(max -> 95, 不娜娜 -> 80, fairy -> 100)
HashMap(14 -> 山西, 42 -> 湖北)

(二)Map 的常用方法--添加元素

  • 对于可变 Map,我们可以使用 += 操作符或者 put 方法来添加键值对。

添加元素到可变 Map 的格式(+= 操作符):mapName += (key -> value)

添加元素到可变 Map 的格式(put 方法):mapName.put(key, value)

  • 对于不可变 Map,由于其不可修改的特性,我们需要创建一个新的 Map 来包 含新的元素。

添加元素到不可变 Map 的格式(通过创建新 Map):val newMapName : Map[KeyType, ValueType] = oldMapName + (newKey ->newValue)

(三)Map 的常用方法--查询元素

使用 get 方法来查询 Map 中的值,或者直接Map(key)。

查询 Map 元素的格式(get 方法):

val valueOption: Option[ValueType] = mapName.get(key)

返回值是一个 Option 类型,它 可能包含值(如果键存在)或者为 None(如果键不存在)

(四)Map 的常用方法 -- 删除元素(仅针对可变 Map)

对于可变 Map,我们可以使用-=操作符或者 remove 方法来删除键值对。

删除可变 Map 元素的格式(-= 操作符):mapName -= key

删除可变 Map 元素的格式(remove 方法): mapName.remove(key)

(五)Map 的遍历

使用 for 循环或者 foreach 方法来遍历 Map。

使用 for 循环遍历 Map 的格式:

for ((key, value) <- mapName) {

  // 操作,如打印 key 和 value

}

使用 foreach 方法遍历 Map 的格式:****

mapName.foreach { case (key, value) =>

  // 操作,如打印 key 和 value

}

总结:

/*
* Map 映射 表示一种一一对应的关系!
*
* 1.添加
* 2.删除
* 3.查询 对应的值
* 4.遍历
* */
object map01 {
  def main(args: Array[String]): Unit = {
    //创建可变的Map 键值对
    val scores = scala.collection.mutable.Map("fairy" -> 100,"不娜娜" -> 80)
    //1.添加
    scores += ("max" -> 95)
    println(scores)

    //2.删除fairy 删除操作是根据key来做的
    scores -= "fairy"
    println(scores)

    //3.查询 查看不娜娜的分数 rst 是一个option类型
    val rst = scores.get("不娜娜")
    if(rst.isEmpty){
      println("不娜娜没有成绩")
    }else{
      println(rst.get)
    }
    //4.打印scores
    println(scores)
    //for
    for((key,value) <- scores){
      println(s"${key},${value}分")
    }

    //foreach
    scores.foreach({
      case (key,value) => println(s"${key},${value}分")
    })

  }
}

//运行结果:
HashMap(max -> 95, 不娜娜 -> 80, fairy -> 100)
HashMap(max -> 95, 不娜娜 -> 80)
80
HashMap(max -> 95, 不娜娜 -> 80)
max,95分
不娜娜,80分
max,95分
不娜娜,80分

进程已结束,退出代码为 0

实训任务:

  1. 创建一个可变 Map,用于存储图书馆中的书籍信息(键为书籍编号,值为包含书籍名称、作者、库存数量的元组),初始化为包含几本你喜欢的书籍信息。
  2. 使用 += 操作符添加两本新的书籍到图书馆集合中。
  3. 根据书籍编号查询某一本特定的书籍信息,使用 get 方法,并输出结果。
  4. 修改某本书籍的库存数量(假设可以通过键找到对应的元组并修改其中的值,这里体现可变 Map 的特性)。
  5. 使用 -= 操作符从图书馆集合中删除一本书。
  6. 遍历图书馆书籍 Map,并打印出每本书的信息。

代码如下:

import scala.collection.mutable

object LibApp {
  def main(args: Array[String]): Unit = {
    // 1. 创建可变 Map
    val lib = mutable.Map(
      "B001" -> ("Java编程", "Bruce", 3),
      "B002" -> ("Scala实战", "Martin", 2),
      "B003" -> ("算法", "Thomas", 1)
    )
    println("初始:")
    printBooks(lib)

    // 2. 添加新书
    lib += ("B004" -> ("Python入门", "Eric", 4))
    lib += ("B005" -> ("C++基础", "Stanley", 2))
    println("\n添加后:")
    printBooks(lib)

    // 3. 查询书籍
    val id = "B003"
    val book = lib.get(id)
    println(s"\n查 '$id': $book")
    
    lib.get(id) match {
      case Some((name, author, stock)) => 
        println(s"详情: $id, $name, $author, $stock")
      case None => 
        println(s"无 '$id'")
    }

    // 4. 修改库存
    val updateId = "B001"
    lib.get(updateId) match {
      case Some((name, author, _)) =>
        lib(updateId) = (name, author, 5)
        println(s"\n更新 '$updateId' 库存为 5")
      case None =>
        println(s"\n无 '$updateId'")
    }

    // 5. 删除书
    val delId = "B002"
    lib -= delId
    println(s"\n删除 '$delId' 后:")
    printBooks(lib)

    // 6. 遍历并打印所有书籍信息
    println("\n 遍历所有书籍:")
    lib.foreach { case (id, (name, author, stock)) => 
      println(s"  编号: $id, 书名: $name, 作者: $author, 库存: $stock")
    }
  }

  def printBooks(books: mutable.Map[String, (String, String, Int)]): Unit = {
    books.foreach { case (id, (name, author, stock)) => 
      println(s"  $id: $name, $author, $stock")
    }
  }
}

运行结果如下:

 B001: Java编程, Bruce, 3
  B002: Scala实战, Martin, 2
  B003: 算法, Thomas, 1

添加后:
  B001: Java编程, Bruce, 3
  B002: Scala实战, Martin, 2
  B003: 算法, Thomas, 1
  B004: Python入门, Eric, 4
  B005: C++基础, Stanley, 2

查 'B003': Some((算法,Thomas,1))
详情: B003, 算法, Thomas, 1

更新 'B001' 库存为 5

删除 'B002' 后:
  B001: Java编程, Bruce, 5
  B003: 算法, Thomas, 1
  B004: Python入门, Eric, 4
  B005: C++基础, Stanley, 2

遍历所有书籍:
  编号: B001, 书名: Java编程, 作者: Bruce, 库存: 5
  编号: B003, 书名: 算法, 作者: Thomas, 库存: 1
  编号: B004, 书名: Python入门, 作者: Eric, 库存: 4
  编号: B005, 书名: C++基础, 作者: Stanley, 库存: 2