4.1构造映射
val scores=Map("Alice"->10,"Bob"->3,"Cindy"->8) //一个不可变的Map[String,Int],其值不能改变。
val=scores=scala.collection.mutable.Map("Alice"->10,"Bob"->3,"Cindy"->8) //这是一个可变映射
在Scala中,映射是对偶的集合,对偶简单的说就是两个值构成的组,这两个值并不一定是同一类型(“Alice”,10)
4.2获取映射中的值
val bobScore=scores("Bob") //类似Java中的scores.get("Bob")
如果映射不包含此键,查询时将会产生异常,要检查映射中是否包含此键可以使用contains方法,scores.contains("Bob")
一般比较常见的使用:
val bobScore=scores.getOrElse("Bob",0) //映射中包含键“Bob”,则返回Bob对应的值,否则返回0
4.3更新映射的值
在可变映射中,可以更新或者添加一个新的映射:
scores("Bob")=88 //更新Bob的值
scores("Fred")=99 //添加新的键值对
或者可以使用+=操作来添加多个关系
scores+=("Bob"->88,"Fred"->99)
对应不可更新的映射,可以通过生产一个全新的映射来改变里面的映射值:
val newScores=scores+("Bob"->88,“Fred”->99) //此处Bob被更新,Fred被插入
同理可以从不可变映射中移除一个某个键,可以使用-
var scores=scores - "Alice"
实际上此中处理方法效率不太差,因为老的映射和新的映射都共享一部分结构
4.4迭代映射
for((k,v) <-映射) 处理k和v
如果需要单独访问k或者v,想java一样,可以使用keySet和value.
scores.keySet //一个类似Set("Bob","Cindy","Fred","Alice")
for(v<-sorces.values) println(v)
反正一个映射使用
for((k,v)<-映射)yield(v,k)
4.5已排序映射
默认情况下,我们一个使用哈希表,由于对使用的键没有很好的哈希函数,或者需要顺序的访问所有键,此时我们可以采用树 形映射
不可变的树形映射的定义
val scores=scala.collection.imutable.SortedMap("Alice"->10,"Fred"->7)
scala2.9没有可变的树形映射,如下需要可变映射,可以使用Java的TreeMap.
提示:如果需要按顺序访问所有键,使用LinkedHashMap
4.6 与java的相互操作
java中映射转成scala映射,值需要添加一个引用语句:
import scala.collection.JavaConversions.mapAsScalaMap
val scores:scala.collection.mutable.Map[String,Int]=new java.util.TreeMap[String,Int]
此外也可以从java.util.Properties到Map[String,Int]的转换
import scala.collection.JavaConversions.propertiesAsScalaMap
val props:scala.collection.Map[String,String]=System.getproperties()
反过来讲scala映射转成java映射
import scala.collection.JaveConversions.mapAsJaveMap
import java.awt.font.TextAttribute._ //引入下面的映射会用到
val attrs=Map(Famlly->"serif",SIZE->12) //scala 映射
val font=new java.awt.Font(attrs) //该方法预期一个Java映射
4.7元组
映射是键值对的集合,对偶是元组(Tuple)的最简单的形式---元组是不同类型的值的聚集
元组的值是通过将单个的值包含在圆口号中构成的,例如:(1,3.14,“Fred”)是一元组,
类型为:Tuple3[Int,Double,java.lang.String] 也可以写成:(Int,Double,java.lang.String)
假如一个元组如下:
val t=(1.3.14,"Fred")
你可以使用_1,_2,_3访问其组元
val second=t._2 //second的值为3.14
注意:和数组或字符串不同的是,元组的个组员是从1开始,二不是0
通常使用模式匹配来获取元组的组元: val (first,second,third)=t //将first设置1,second为3.14,third为Fred
如果并不是所有的组元都需要,可以使用:val(first,second,_)=t, //将只获取需要的值,first设置1,second为3.14
注意:元组可以用于函数返回不止一个值的情况,StringOps的partiton方法返回的不是一对字符串。
“New York”.partiton(_.isUpper) //输出对偶尔(“NY”,"ew ork")
4.8 拉链操作
使用元组的原因之一是吧多个值捆绑到一起,以便一起处理,经常使用zip方法来完成。
val symbols=Array("<","-",">")
val counts=Array(2,10,2)
val pairs=symbols.zip(counts)
输出对偶Array(("<"2),("-",10),(">",2))
然后这些对偶就可以一起处理:
for((s,n)<-pairs) Console.print(s*n)
提示:用toMap方法可以将对偶的集合转成映射
如果有一个键的集合,也有一个与之对应的值的集合,可以使用拉链操作将它们组合到一起
keys.zip(values).toMap