@Arslan6and6
2016-09-04T03:13:37.000000Z
字数 3648
阅读 557
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" -> 10
res12: (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 0
bosScore: Int = 3
简洁写法 映射包含某个键就返回键对应的值,否则就返回后面的数字,在此是 0
scala> val bosScore = d.getOrElse("bo", 0)
bosScore: Int = 3
scala> val bosScore = d.getOrElse("x", 0)
bosScore: Int = 0
以上例可变映射 b 为例:
scala> b
res16: scala.collection.mutable.Map[String,Int] = Map(al -> 10, ci -> 8, bo -> 3)
修改某个键对应的值
scala> b("bo")=6
scala> b
res18: scala.collection.mutable.Map[String,Int] = Map(al -> 10, ci -> 8, bo -> 6)
新增键值对
scala> b("ec")=17
scala> b
res20: 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> d
res24: 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:al
K:bo
K:f
遍历键值对中的值
scala> for (v <- newd2.values) print(v + "\t")
10 D FC
scala> for((k, v) <- newd2) println ("k:" + k + "\t" + "v:" +v)
k:al v:10
k:bo v:D
k:f v:FC
分别得到键和值
scala> newd2.keySet
res42: scala.collection.immutable.Set[String] = Set(al, bo, f)
scala> newd2.values
res40: 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.mapAsScalaMap
scala> 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._2
t2: Double = 3.14
//或是 使用空格而不是 .
//使用模式匹配获取组元
scala> val first = 1;
first: Int = 1
scala> val second = 3.14
second: Double = 3.14
scala> val third = "fr"
third: String = fr
scala> val (first, second, third) = t
first: Int = 1
second: Double = 3.14
third: String = fr
scala> t._2
res3: 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).toMap
mapping: scala.collection.immutable.Map[String,Int] = Map(k1 -> 10, k2 -> 20, k3 -> 30)