Scala有十分易用的语法来创建、查询和便利映射,你需要从可变的和不可变的映射中做出选择。默认情况下,你得到的是一个哈希映射,不过你也可以指明要树形映射。
你可以很容易地在Scala映射和Java映射之间来回切换元组可以用来聚集值。
映射与元组
映射(Map)是一种可迭代的键值对结构(也称映射或关联)。Scala的Predef类提供了隐式转换,允许使用另一种语法:key -> value
,来代替(key, value)
。如:Map("x" -> 24, "y" -> 25, "z" -> 26)
等同于Map(("x", 24), ("y", 25), ("z", 26))
,却更易于阅读。
与列表一样,元组也是不可变的,但与列表不同的是元组可以包含不同类型的元素,元组的值是通过将单个的值包含在圆括号中构成的,如val t = (1, 3.14, "Fred")
构建及更新映射
scala映射,是一对键值对,相当于java中的Map
对偶:由两个值构成的组,形式 : 值1->值2,值1和值2类型不一定要相同,可以理解为对偶就是一个key/value
映射就是对偶的集合
val scores = Map("Jim"->10, ("Tom",20), "Sam"->44) //声明一个不可变映射,命名为scores
val s = scala.collection.mutable.Map("Jim"->10, ("Tom",20), "Sam"->44) //声明一个可变映射,使用了两种方法声明了映射中的元素,第一种为Key->Value的形式,第二种为(Key,Value)的形式
val s1 = new scala.collection.mutable.HashMap[String, Int] //声明一个空的可变映射,并设置Key为String类型变量,Value为Int型变量
s.+=(("Lily"->10)) //向s映射添加元素:("Lily"->10)
s1.+=(("Jim"->10)) //向s1映射添加元素:("Jim"->10)
println(scores)
println(s)
println(s1)
查看映射中的值
映射的 get 方法返回的是一个 Option 类对象,要么是 Some,要么是 None
// 声明一个不可变映射
val scores = Map("Jim"->10, ("Tom",20), "Sam"->44)
// 将scores映射中键名为‘Lily’的值赋给变量score1,由于scores映射不存在该键,程序将会报错
val score1 = scores("Lily")
// 将scores映射中键名为'Tom'的值赋给变量score2,如果该键不存在,将会赋给score变量0值
val score2 = scores.getOrElse("Tom",0)
// 同第三条语句原理一样,将键名对应的键提取出来,如果不存在,则返回一个缺省值
val score3 = scores.getOrElse("Lily",0)
构建元组
映射是键/值对偶的集合。对偶是元组的最简单形态——元组是不同类型的值的聚合。
元组是不同类型的值的聚集,对偶是元组的最简单的实现
val tuple = (1, 3.14, "Hello") //构建一个元组,类型为Tuple3(Int, Double, String)
println(tuple._1) //输出元组第一个元素,需要注意,元组的下标是从1开始的
val(first, second, _) = tuple //直接获取元组前两个元素
如果不是每一个组员都需要,可以在不需要的位置使用_
注意:元组的下标是从1开始的
拉链操作
使用元组的原因之一是把多个值绑定在一起,以便他们能够被统一处理,这通常可以用zip方法来完成。
val symbols = Array("<","-",">")
val count = Array(2,10,2)
val pairs = symbols.zip(count)
输出结果为:pairs: Array[(String, Int)] = Array((<,2), (-,10), (>,2))
然后可以对输出结果作统一的处理:
for((s,n) <- pairs) Console.print( s * n)
输出结果:<<---------->>
toMap方法可以对偶集合转化为映射。
symbols.zip(count).toMap