@Arslan6and6
2016-09-04T03:13:37.000000Z
字数 3648
阅读 623
scala学习
不可变映射scala> val a = Map("al"->10,"bo"->3,"ci"->8)a: scala.collection.immutable.Map[String,Int] = Map(al -> 10, bo -> 3, ci -> 8)可变映射scala> val b = scala.collection.mutable.Map("al"->10,"bo"->3,"ci"->8)b: scala.collection.mutable.Map[String,Int] = Map(al -> 10, ci -> 8, bo -> 3)新建空映射,需要给定参数类型scala> val c = new scala.collection.mutable.HashMap[String, Int]c: scala.collection.mutable.HashMap[String,Int] = Map()映射是对偶的集合,对偶是2个值构成的组,这2个值类型不一定相同->操作符创建对偶scala> "al" -> 10res12: (String, Int) = (al,10)可以种这种方法创建映射scala> val d = Map(("al",10),("bo",3),("ci",8))d: scala.collection.immutable.Map[String,Int] = Map(al -> 10, bo -> 3, ci -> 8)
映射名称.("键名称") 查询键对应的值scala> d("bo")res14: Int = 3查询映射是否包含某个键,并返回键对应的值scala> val bosScore = if (d.contains("bo")) d("bo") else 0bosScore: Int = 3简洁写法 映射包含某个键就返回键对应的值,否则就返回后面的数字,在此是 0scala> val bosScore = d.getOrElse("bo", 0)bosScore: Int = 3scala> val bosScore = d.getOrElse("x", 0)bosScore: Int = 0
以上例可变映射 b 为例:scala> bres16: scala.collection.mutable.Map[String,Int] = Map(al -> 10, ci -> 8, bo -> 3)修改某个键对应的值scala> b("bo")=6scala> bres18: scala.collection.mutable.Map[String,Int] = Map(al -> 10, ci -> 8, bo -> 6)新增键值对scala> b("ec")=17scala> bres20: scala.collection.mutable.Map[String,Int] = Map(al -> 10, ci -> 8, ec -> 17, bo -> 6)用 += 还可以新增多个键值对scala> b+=("fs"->9 , ""-> 21)res21: b.type = Map(fs -> 9, al -> 10, ci -> 8, ec -> 17, "" -> 21, bo -> 6)用 -= 删除键值对scala> b-=("ci", "")res22: b.type = Map(fs -> 9, al -> 10, ec -> 17, bo -> 6)scala> b-="al"res23: b.type = Map(fs -> 9, ec -> 17, bo -> 6)不可变映射本身不能被修改,但是可以用 原映射 + 或 - 修改操作 得到一个新的映射scala> dres24: scala.collection.immutable.Map[String,Int] = Map(al -> 10, bo -> 3, ci -> 8)修改了 bo 键对应的值,新增了 f -> FC 键值对scala> val newd = d + ("bo" -> "D" , "f" -> "FC")newd: scala.collection.immutable.Map[String,Any] = Map(al -> 10, bo -> D, ci -> 8, f -> FC)删除键值对 得到新的映射scala> val newd2 = newd - "ci"newd2: scala.collection.immutable.Map[String,Any] = Map(al -> 10, bo -> D, f -> FC)新老映射共享大部分结构,这样操作效率并不低
"for((k, v) <- 映射) 处理 k 和 v "
遍历键值对中的键scala> for(k <- newd2.keySet) println ("K:" + k)K:alK:boK:f遍历键值对中的值scala> for (v <- newd2.values) print(v + "\t")10 D FCscala> for((k, v) <- newd2) println ("k:" + k + "\t" + "v:" +v)k:al v:10k:bo v:Dk:f v:FC分别得到键和值scala> newd2.keySetres42: scala.collection.immutable.Set[String] = Set(al, bo, f)scala> newd2.valuesres40: Iterable[Any] = MapLike(10, D, FC)
不可变树形映射scala> val a = scala.collection.immutable.SortedMap("Al" -> 10, "Fr"->7, "Bo"->3, "Ci"->8)a: scala.collection.immutable.SortedMap[String,Int] = Map(Al -> 10, Bo -> 3, Ci -> 8, Fr -> 7)
把Java映射转换为Scala映射scala> import scala.collection.JavaConversions.mapAsScalaMapscala> val b:scala.collection.mutable.Map[String,Int]=new java.util.TreeMap[String, Int]b: scala.collection.mutable.Map[String,Int] = Map()
//元组是不同类型值的聚集scala> val t = (1, 3.14, "fr")t: (Int, Double, String) = (1,3.14,fr)//使用 _1, _2, _3 访问组元scala> val t2 = t._2t2: Double = 3.14//或是 使用空格而不是 .//使用模式匹配获取组元scala> val first = 1;first: Int = 1scala> val second = 3.14second: Double = 3.14scala> val third = "fr"third: String = frscala> val (first, second, third) = tfirst: Int = 1second: Double = 3.14third: String = frscala> t._2res3: Double = 3.14//元组可以用于函数返回不止一个值的情况。举例来说partition返回的是一对字符串,包含了满足某个条件和不满足条件的字符scala> "New York".partition(_.isUpper)res9: (String, String) = (NY,ew ork)
使多个元素配对并绑在一起,用zip方法
scala> val c = Array("<", "-", ">")c: Array[String] = Array(<, -, >)scala> val d = Array(2, 10 , 7)d: Array[Int] = Array(2, 10, 7)scala> val e = c.zip(d)e: Array[(String, Int)] = Array((<,2), (-,10), (>,7))scala> for((s, n ) <- e) print(s*n)<<---------->>>>>>>//注意,此处必须是 字符串 s * 整数 n ,调换位置不行//用 toMap 方法将对偶的集合转换成映射scala> val keyArray = Array("k1", "k2", "k3")keyArray: Array[String] = Array(k1, k2, k3)scala> val valueArray = Array(10, 20, 30)valueArray: Array[Int] = Array(10, 20, 30)scala> val pairs = keyArray.zip(valueArray)pairs: Array[(String, Int)] = Array((k1,10), (k2,20), (k3,30))scala> val mapping = keyArray.zip(valueArray).toMapmapping: scala.collection.immutable.Map[String,Int] = Map(k1 -> 10, k2 -> 20, k3 -> 30)