美文网首页程序员
快学Scala(第二版)》-CH4 映射和元组

快学Scala(第二版)》-CH4 映射和元组

作者: xhades | 来源:发表于2017-12-11 21:06 被阅读0次

    少年壮志不言愁
    劝君惜取少年时

    • 映射是键/值对的集合,Scala用元组表示n个对象的聚集,这些对象并不一定必须是相同的类型

    • 映射构造及获取值:Scala中映射对偶(对偶就是两个值构成的)的集合,->操作符用来创建对偶

      scala> val s = Map("a" -> 2, "b" -> 3)   // 构造不可变映射
      s: scala.collection.immutable.Map[String,Int] = Map(a -> 2, b -> 3)
      
      scala> val ims = scala.collection.mutable.Map("ia" -> 2, "ib" -> 3)   // 构造可变映射
      ims: scala.collection.mutable.Map[String,Int] = Map(ia -> 2, ib -> 3)
      
      scala> val sa = s("a")  // ()表示法查找键对应的值
      sa: Int = 2
      
      scala> s.contains("a")  // contains方法检查映射中是否含有某个指定的键
      res61: Boolean = true
      
      scala> s.get("b")  // get方法返回Option对象, 有键就是Some,没有就是None
      res63: Option[Int] = Some(3)
      
      scala> s.get("c")
      res64: Option[Int] = None
      
      scala> s.getOrElse("c", 0)  //快捷写法,没有键就返回指定默认值
      res66: Int = 0
      
    • 更新映射的值: 更新映射主要分为更新可变映射和不可变映射

      • 更新可变映射
        • =左侧使用()
          scala> ims("ia") = 5  // 更新键"a"对应的值
          
          scala> ims("ic") = 7  // 增加新的键值对
          scala> ims
          res74: scala.collection.mutable.Map[String,Int] = Map(ia -> 5, ic -> 7, ib -> 3)
          
          scala> ims += ("id" -> 8, "ie" ->10 )  // +=添加多个关系
          res75: ims.type = Map(ia -> 5, ic -> 7, ib -> 3, ie -> 10, id -> 8)
          
          scala> ims -= ("ia")   // -=移除某个键值对
          res76: ims.type = Map(ic -> 7, ib -> 3, ie -> 10, id -> 8)
          
      • 更新不可变映射,构造一个包含不可变映射的新映射
        • scala> s
          res77: scala.collection.immutable.Map[String,Int] = Map(a -> 2, b -> 3)
          
          scala> val new_s = s + ("c" -> 5, "d" -> 6)
          new_s: scala.collection.immutable.Map[String,Int] = Map(a -> 2, b -> 3, c -> 5, d -> 6)
          
    • 迭代映射:使用for循环的模式匹配,for ((k, v) <- 映射) 处理 k v,映射使用keySetvalues方法访问键和值
      Scala交换键值位置实现反转一个映射for ((k, v) <- 映射) yield (v, k)

    • Scala通过哈希表和平衡树实现映射,默认情况下是基于哈希表(更加高效),哈希表使用键的哈希码来划定位置,因此遍历以一种不可预期的顺序交出元素。
      如果需要按照顺序依次访问映射中的键,可以使用SortedMap
      如果要按插入顺序访问所有键,使用LinkedHashMap

    • 元组是不同类型值得聚集,元组的值是通过将单个的值包括在圆括号中构成的,例如(1, 3,14, "xhades")是一个Tuple3[Int, Double, java.lang.String]类型的元组

      访问元组主要通过_1_2_3方法(也可以把t._1写成t _1),注意元组的各组成部件从1开始,而不是从0

      如果并不是所有的部件都需要,那么可以在不需要的位置使用_

    • Scala使用拉链操作(zip方法)实现元组组成的集合

      scala> val a = Array("scala","python", "java")
      a: Array[String] = Array(scala, python, java)
      
      scala> val b = Array(1, 2, 3)
      b: Array[Int] = Array(1, 2, 3)
      
      scala> a.zip(b)
      res67: Array[(String, Int)] = Array((scala,1), (python,2), (java,3))
      

      这样这些对偶就可以被一起处理了

      toMap方法可以将对偶的集合转换成映射a.zip(b).toMap

      scala> a.zip(b).toMap
      res68: scala.collection.immutable.Map[String,Int] = Map(scala -> 1, python -> 2, java -> 3)
      

    相关文章

      网友评论

        本文标题:快学Scala(第二版)》-CH4 映射和元组

        本文链接:https://www.haomeiwen.com/subject/xmlbixtx.html