快学Scala(4)--映射和元组

Posted on 2017-03-26 11:23  paulingzhou  阅读(163)  评论(0编辑  收藏  举报

构造映射:

val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)  //不可变映射
val scores2 = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)  //可变映射
val socres3 = new mutable.HashMap[String, Int]  //空映射

 

获取映射中的值:

val bobScore = scores("Bob")    //类似于Java中的scores.get("Bob"),如果映射不包含请求中使用的键,则会抛出异常

 

检查是否有某个指定的键:

val bobScore1 = if(scores.contains("Bob")) scores("Bob") else 0
val bobScore2 = scores.getOrElse("Bob", 0)    //若映射中包含"Bob",则返回对应的值,否则返回0

  

更新映射中的值:

scores2("Bob") = 10
scores2("Fred") = 7
scores2 += ("Bob" -> 10, "Fred" -> 7)
scores2 -= "Alice"
val newScores = scores + ("Bob" -> 10, "Fred" -> 7)   //更新过的映射

  注:只能更新一个可变映射中的键值对;但是对于不可变映射可以使用最后一种方法

迭代映射:

println(scores.keySet)
for(v <- scores.values) println(v)
println("")
for(k <- scores.keys) println(scores(k))
println("")
for(k <- scores.keySet) println(scores(k))

  输出结果:

 

与Java的交互操作:

import scala.collection.JavaConverters._

...

val scores4 : java.util.Map[String, Int] = scores2.asJava
val scores5 : mutable.Map[String, Int] = scores4.asScala

  关于JavaConverters api详情见 http://www.scala-lang.org/api/current/scala/collection/JavaConverters$.html

 

元组(Tuple)

val t = (1, 3.14, "Fred")
println(t._1)
var (first, second, third) = t
(first, second, _) = t

  

拉练操作:

val symbols = Array("<", "-", ">")
val counts = Array(2, 10, 2)
val pairs = symbols.zip(counts)
for((s,n) <- pairs) print(s * n)

  注:代码中的"*"为复写方法,表示将字符串s重复n次

keys.zip(values).toMap

  存在一个键的集合,以及一个与之平行对应的值的集合,那么就可以使用拉练操作将他们组合成一个对偶的集合,再用toMap方法将其转换成映射