Scala学习笔记(四):映射和元组

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

  

    

   

猜你喜欢

转载自blog.csdn.net/fengfengchen95/article/details/81603285