美文网首页程序员
快学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