摘自《快学Scala》
// 构造一个不可变的Map[String, Int],其值不能被改变
val scores = Map("Alice"->10, "Bob"->3, "Cindy"->8)
//从空映射开始
val scores = new scala.collection.mutable.HashMap[String, Int]
->操作符用来创建对偶:
"Alice" -> 10
得到("Alice", 10)
val scores = Map(("Alice",10),("Bob",3),("Cindy",8))
val bobsScore = scores("Bob") //类似Java中的scores.get("Bob")
//如果映射并不包含请求中使用的键,则会抛出异常
//contians方法:
val bobsScore = if(scores.contains("Bob")) scores("Bob") else 0
val bobsScore = scores.getOrElse("Bob",0)
//如果映射包含键"Bob",返回对应的值,否则返回0
在可变映射中,可以更新某个映射的值,或者添加一个新的映射关系。
scores("Bob") = 10//更新键"Bob"对应的值,假定scores是可变的
scores("Fred") = 7 //增加新的key/value到scores,假定scores是可变的
+= 操作来添加多个关系:
scores += ("Bob"->10, "Fred"->7)
-= 操作来移除某个键和对应的值:
scores -= "Alice"
//对不可变映射来说,可以获取一个包含所需要的更新的新映射
val newScore = scores + ("Bob"->10, "Fred"->7) //更新过的新映射
//newScore映射包含了与scores相同的映射关系,此外"Bob"被更新,"Fred"被添加进来
//还可以更新var变量
var scores = ...
scores = scores + ("Bob"->10, "Fred"->7)
scores = scores - "Alice"
for((k,v) <- 映射) 处理 k 和 v
//只需访问键或值:
scores.keySet //一个类似Set("Bob","Cindy","Fred","Alice")这样的集合
for(v <- scores.values) println(v)
翻转一个映射——交换键和值的位置:
for((k,v) <- 映射) yield(v,k)
操作映射时,须要选定一个实现——一个哈希表或者一个平衡树。默认情况下,Scala给的是哈希表。由于对使用的键没有很好的哈希函数,或者需要顺序的访问所有的键,因此你可能会想要一个树形映射。
// 得到一个不可变的树形映射而不是哈希映射
val scores = scala.collection.immutable.SortedMap(
"Slice" -> 10,
"Fred" -> 7,
"Bob" -> 3,
"Cindy" -> 8
)
//如果要按插入顺序访问所有键,使用LinkedHashMap,如:
val months = scala.collection.mutable.LinkedHashMap(
"January" -> 1,
"February"->2,
"March"->3,
...
)
略
映射是键/值对偶的集合。对偶是元组(tuple)的最简单形态——元组是不同类型的值的聚集。
如:
(1,3.14,"Fred")//一个元组,类型为Tuple3[Int, Double, java.lang.String]
//类型定义也可以写为:
(Int,Double,java.lang.String)
val t = (1,3.14,"Fred")
val second = t._2 //将second设为3.14
和数组或字符串中的位置不同,元组的各组员从1开始,而不是0
使用元组的原因之一是把多个值绑在一起,以便它们能够被一起处理,这通常可以用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