4 映射和元組

構造映射

  • 映射是鍵/值對偶的集合
  • 構造映射使用Map(鍵1->值1,...,鍵n->值n)Map((鍵1,值1),...,(鍵n,值n))或默認爲不可變映射。
  • 映射本質上是兩個元素的對偶,不過Map的鍵不能重複,元組的的兩個元素的第一個可以重複;如果鍵重複出現,其值會是最後出現的鍵對應的值
scala> val haohan=Map("及時雨"->"宋江","玉麒麟"->"盧俊義","智多星"->"吳用")
haohan: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 智多星 -> 吳用)

scala> val tiangang=Map(("及時雨","宋江"),("玉麒麟","盧俊義"),("智多星","吳用"))
tiangang: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 智多星 -> 吳用)
// 從數組構造
scala> val aa=Array(("及時雨","宋江"),("玉麒麟","盧俊義"),("及時雨","吳用"))
aa: Array[(String, String)] = Array((及時雨,宋江), (玉麒麟,盧俊義), (及時雨,吳用))
// 將數組作爲多個參數
scala> val b=Map(aa: _*)
b: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 吳用, 玉麒麟 -> 盧俊義)

  • 可變映射 ,使用scala.collection.mutable.Map
//創建一個空映射
scala> val sanqing=scala.collection.mutable.Map[String,Int]()
sanqing: scala.collection.mutable.Map[String,Int] = Map()
//可變的非空映射
scala> val haohan2=scala.collection.mutable.Map("及時雨"->"宋江","玉麒麟"->"盧俊義","智多星"->"吳用")
haohan2: scala.collection.mutable.Map[String,String] = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 智多星 -> 吳用)

獲取映射的值

  • 直接用變量名(鍵)來取值
  • 如果鍵不存在會報錯,可以使用contains方法判斷一個鍵是否存在
  • getOrElse方法,返回的類型是兩個參數的超類型,像if/else似的
scala> haohan("及時雨")
res7: String = 宋江

scala> haohan("入雲龍")
java.util.NoSuchElementException: key not found: 入雲龍
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided
  
scala> haohan.get("玉麒麟")
res8: Option[String] = Some(盧俊義)

scala> haohan.get("入雲龍")
res10: Option[String] = None

scala> haohan.getOrElse("飛天虎","不是好漢")
res11: String = 不是好漢

scala> haohan.getOrElse("智多星","不是好漢")
res12: String = 吳用

scala> haohan.getOrElse("智多星",0)
res16: Any = 吳用
//說是Any,實際上和String的也一樣
scala> haohan.getOrElse("智多星",0)==haohan.get("智多星").get
res18: Boolean = true
  • 不可變的Map使用默認值,適用於直接獲取的時候,使用get獲取還是Option對象。
    – withDefaultValue 提供默認值
    – withDefault 提供默認函數
//withDefaultValue
scala> val haohan5=haohan.withDefaultValue("非梁山好漢")
haohan5: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 智多星 -> 吳用)

scala> haohan5.get("飛天雕")
res25: Option[String] = None

scala> haohan5("飛天雕")
res26: String = 非梁山好漢

scala> haohan5("智多星")
res27: String = 吳用

// withDefault
scala> val haohan6=haohan.withDefault(_+"不是好漢!")  //這裏的下劃線指輸入的鍵
haohan6: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 智多星 -> 吳用)

scala> haohan6("飛天豹")
res28: String = 飛天豹不是好漢!

更新映射的值

  • 更新已存在的鍵的值或添加新的鍵值對:針對可變映射
  • 新增或更新值:變量名(鍵)=值
  • 新增多個:變量名+=((鍵1,值1),...,(鍵n,值n))
scala> haohan("入雲龍")="公孫勝"
<console>:13: error: value update is not a member of scala.collection.immutable.Map[String,String]
       haohan("入雲龍")="公孫勝"
       ^
scala> haohan2("入雲龍")="公孫勝"

scala> haohan2
res33: scala.collection.mutable.Map[String,String] = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 入雲龍 -> 公孫勝, 智多星 -> 吳用)

scala> haohan2 += ("大刀"->"關勝","豹子頭"->"林沖")
res34: haohan2.type = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 豹子頭 -> 林沖, 入雲龍 -> 公孫勝, 大刀 -> 關勝, 智多星 -> 吳用)
  • 移除映射 使用-=
  • 變量名 -= 鍵,如果減去一個不存在的鍵那麼也不會報錯
scala> haohan2 -= "豹子頭"
res36: haohan2.type = Map(及時雨 -> 宋江, 玉麒麟 -> 盧俊義, 入雲龍 -> 公孫勝, 大刀 -> 關勝, 智多星 -> 吳用)
  • 對於不可變映射,不能直接修改其值
  • 可以再原映射基礎上添加形成一個新的映射,原映射保持不變
  • 對於 var的不可變映射,可以用+=或-=的方法更新
scala> var haohan7 = haohan+("大刀"->"關勝","豹子頭"->"林沖")
haohan7: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 智多星 -> 吳用, 玉麒麟 -> 盧俊義, 豹子頭 -> 林沖, 大刀 -> 關勝)

scala> haohan7+=("雙鞭"->"呼延灼")

scala> haohan7
res43: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 智多星 -> 吳用, 玉麒麟 -> 盧俊義, 豹子頭 -> 林沖, 大刀 -> 關勝, 雙鞭 -> 呼延灼)

scala> haohan7 -= "豹子頭"
scala> haohan7
res45: scala.collection.immutable.Map[String,String] = Map(及時雨 -> 宋江, 智多星 -> 吳用, 玉麒麟 -> 盧俊義, 大刀 -> 關勝, 雙鞭 -> 呼延灼)

遍歷映射

  • for((k,v) <- 映射) {處理k和v}
  • 哈哈哈
scala> for((k,v) <- haohan7) println(k+"  "+v)
及時雨  宋江
智多星  吳用
玉麒麟  盧俊義
大刀  關勝
雙鞭  呼延灼

//反轉映射,形成一個新的
scala> for((k,v) <- haohan7) yield(v,k)
res47: scala.collection.immutable.Map[String,String] = Map(呼延灼 -> 雙鞭, 吳用 -> 智多星, 關勝 -> 大刀, 宋江 -> 及時雨, 盧俊義 -> 玉麒麟)

元組

  • 元組是不同類型的數的聚集,將幾個數放在小括號裏就是元組
  • 一個元組最多有22個元素
scala> val t = (1,0.4,"SS")
t: (Int, Double, String) = (1,0.4,SS)

scala> t.getClass.getName
res48: String = scala.Tuple3

scala> val t1=(1,)
<console>:1: error: illegal start of simple expression
val t1=(1,)
          ^
scala> val t2=Tuple1(2)
t2: (Int,) = (2,)
  • 訪問元組的元素,使用變量._數字,從1開始計數。
scala> t._1
res53: Int = 1

scala> t._2
res54: Double = 0.4

scala> t._3
res55: String = SS

拉鍊操作

  • zip方法
scala> val keys=Array("A","B","C")
keys: Array[String] = Array(A, B, C)

scala> val values=Array("a","b","c")
values: Array[String] = Array(a, b, c)

scala> keys.zip(values)
res57: Array[(String, String)] = Array((A,a), (B,b), (C,c))
//轉爲映射
scala> keys.zip(values).toMap
res58: scala.collection.immutable.Map[String,String] = Map(A -> a, B -> b, C -> c)
發佈了75 篇原創文章 · 獲贊 83 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章