構造映射
映射是鍵/值對偶
的集合
構造映射使用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 = 吳用
scala> haohan. getOrElse ( "智多星" , 0 ) == haohan. get ( "智多星" ) . get
res18: Boolean = true
不可變的Map使用默認值,適用於直接獲取的時候,使用get獲取還是Option對象。
– withDefaultValue 提供默認值
– withDefault 提供默認函數
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 = 吳用
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 , )
scala> t. _1
res53: Int = 1
scala> t. _2
res54: Double = 0.4
scala> t. _3
res55: String = SS
拉鍊操作
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)