Scala基础(5):Map、元组

本文探讨Scala中的元组与映射(Map)基础。元组可以通过下标访问元素,如`yz._1`获取第一个元素。映射在Scala中分为可变与不可变,常用创建方式是使用`->`符号。Map的基本操作包括取值、更新和遍历。拉链操作通过`zip`方法结合两个数组生成新的映射。注意不同类型的映射,如`scala.collection.mutable.HashMap`和`scala.collection.immutable.Map`的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

元组

创建元组

  val a = ("Johnny", 2016, "Yang")
  val b = ("Johnny","Yang") //最简单的元组:对偶

基本操作

  val yzSecond1 = yz._2//取出第二个元素
  val yzSecond2 = yz _2;
  println("第二个值是" + yzSecond1)
  println("第二个值是" + yzSecond2)

  // 使用模式匹配
  val (first, second, _) = yz
  println("first:" + first + ";second:" + second)
  }

元组取值和数组不一样,yz._1表示取出第一个元素

映射

Scala中Map(映射)分为可变映射和不可变映射两种,默认创建不可变映射。

创建映射

    // 构建拥有3个对偶的不可变映射
    val map1 = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

    // 构建空的映射可变映射
    val map2 = new scala.collection.mutable.HashMap[String, Int] //这里指定映射实现为HashMap,类型参数为String和Int

    // 构建拥有3个对偶的可变映射
    val map3 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

    // 通过对偶创建映射
    val map4 = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))

“->” 符号用于创建对偶
“Alice” -> 10 会生成 (“Alice”,10)

基本操作

取值
    val arg1 = m("Bob")
    // Scala直接通过 映射(键) 来获取元素,通过 映射.get(键) 得到的是一个Option对象
    val arg2 = if (m.contains("Bob")) m("Bob") else 0// 如果不存在会抛出异常,因此需要作出检查
    val arg3 = m.getOrElse("Bob", 0)// 同上,但是不会报错,如果没有"Bob"会返回0
更新
  /*更新可变映射*/
    m("Bob") = 10
    m +=("Bob" -> 10, "Fred" -> 15) //有就更新,没有就插入
    m -= "Bob" // 移除
  }

  /*更新不可变映射*/
    val newMap = m + ("Bob" -> 10, "Fred" -> 16)
    // 更新不可变映射会创建新的映射,newMap 包含 m 相同映射关系,然后Bob被更新,Fred被添加进来
遍历
  /*遍历映射*/
    for ((k, v) <- m) println("k:" + k + ";v:" + v)

    for ((k, v) <- m) yield (v, k)//返回一个集合,键值反转

  /*遍历映射的键*/
    for (k <- m.keySet) print("k:" + k)

  /*遍历映射的值*/
    for (v <- m.values) print("v:" + v)

拉链操作

    // 拉链操作
    val symbols = Array("<", "-", ">")
    val counts = Array(2, 10, 2)
    val pairs = symbols.zip(counts) // 输出对偶的数组 Array(("<",2),("-",10),(">",2))
    for ((s, n) <- pairs) Console.print(s * n) // 输出:<<-------->>
    val m = pairs.toMap // 转化成映射
    mapIterate(m)//遍历

拉链操作步骤:

  1. 创建两个数组,arrA用于存放键,arrB用于存放值
  2. 使用arrA.zip(arrB)来生成一个新的对偶数组arrC
  3. 使用数组的toMap方法将对偶数组转化成映射

需要注意的:

scala.collection.mutable 和 scala.collection.immutable 中HashMap和Map的区别

package yangjun.myPackage

import yangjun.myClass.Person

import scala.collection.mutable //可变的
import scala.collection.immutable //不可变的

/**
  * Created by Yang Jun on 2016/7/23.
  */
object Test {
  def main(args: Array[String]): Unit = {
    demo001
    demo002
    demo003
    demo004
  }

  def demo001(): Unit = {
    // 变量 + 可变
    var rmm = mutable.Map("a" -> 1, "b" -> 2)
    //rmm += ("c" -> 3)//+=操作成功
    var rmh = mutable.HashMap("a" -> 1, "b" -> 2)
    //rmh += ("c" -> 3)//+=操作成功

  }

  def demo002(): Unit = {
    // 变量 + 不可变
    var rim = immutable.Map("a" -> 1, "b" -> 2)
    //rim += ("c" -> 3)//+=操作成功
    var rih = immutable.HashMap("a" -> 1, "b" -> 2)
    //rih += ("c" -> 3)//+=操作成功

    // 首先返回的是一个新的映射,然后变量重新指向

  }

  def demo003(): Unit = {
    // 常量 + 可变
    val lmm = mutable.Map("a" -> 1, "b" -> 2)
    //lmm += ("c" -> 3) //+=操作成功
    val lmh = mutable.HashMap("a" -> 1, "b" -> 2)
    //lmh += ("c" -> 3) //+=操作成功

    // mutable.Map 和 mutable.HashMap 有 += 函数
  }


  def demo004(): Unit = {
    // 常量 + 不可变
    val lim = immutable.Map("a" -> 1, "b" -> 2)
    //lim += ("c" -> 3) //+=操作失败
    val lih = immutable.HashMap("a" -> 1, "b" -> 2)
    //lih += ("c" -> 3) //+=操作失败

    // immutable.Map 和 immutable.HashMap 没有 += 函数
  }

}

详见 http://blog.youkuaiyun.com/shen_jz2012/article/details/50320929

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值