构造映射
不可变映射:
1
| val scores = Map("amy" -> 10, "bob" -> 3, "cindy" -> 8)
|
可变映射:
1 2
| val scores = scala.collection.mutable.Map("amy" -> 10, "bob" -> 3, "cindy" -> 8)
|
创建空映射需要给定映射实现和值类型
1
| val scores = scala.collection.mutable.Map[String,Int]()
|
获取映射中的值
直接用()表示方法来查询
如果不包括这个键,则抛出异常,contanis方法用来检查是否包括某个键
1 2 3 4 5
| val bobScore = scores("bob") val bobScore = if(socres.contains("bob")) scores("bob")else 0
val bobScore = scores.getOrElse("bob",0)
|
更新映射中的值
直接用赋值语句更改某个映射的值,如果不存在会创建
通过+=来操作多个
通过-=来移除键
1 2 3 4
| scores("bob") = 10 scores("frank") = 11 scores+=("bob" -> 10, "frank" -> 7) scores-="amy"
|
不能更新不可变的映射,但是可以获取一个新映射并且更新旧映射里的值
1 2 3
| val newScores = socres+("bob" -> 10, "frank" -> 7)
|
迭代映射
scala直接用下面的写法进行映射的迭代操作
for((k,v) <- 映射) 处理 k和v
还可以只访问键或者值
1 2 3 4 5 6
| for((k,v) <- scores) print(k+": "+v) for(v <- scores.values) print(v) for(k <- scores.keySet) print(k)
for((k,v) <- scores) yield (v,k)
|
已排序映射
映射有两种实现方式,哈希表和平衡树,scala默认用哈希表实现,但返回的元素是乱序的,如果需要顺序,使用sortedMap,会按照key来排序。
还可以使用LinkedHashMap,会按照元素插入顺序排序
与Java的互操作
映射可以在Java和Scala间相互转换
Java to Scala:
1 2 3 4 5 6 7 8
| import scala.collection.JvavaConversions.mapAsScalaMap
val scores: scala.collection.mutable.Map[String,Int] = new java.util.TreeMap[String,Int]
import scala.collection.JavaConversions.propertiesAsScalaMap val props: scala.collection.Map[String,String] = System.getProperties()
|
Scala to Java:
1 2 3 4
| import scala.collection.JavaConversions.mapAsJavaMap import java.awt.font.TextAttribute._ val attrs = Map(FAMILY -> "self", SIZE -> 12) val font = new java.awt.Font(attrs)
|
元组
元组是不同类型的值的组合,最常见的是对偶元组,映射里的每个元素都是元组。
通过()将多个单一值扩起来组成元组。
通过_1, _2的形式访问元组中对应的元素
1 2 3 4 5 6 7
| val t=(1,3.14,"bob")
Tuple3[Int,Double,java.lang.String]
val second = t._2
|
可以用模式匹配的方式获取元组的组成部件
元组用于函数有多个返回值的情况
1 2 3 4 5
| val (first,second,third) = t val (first,second,_) = t
"New York".partition(_.isUpper)
|
拉链操作
通过zip方法,将多个值一起处理,返回多个元组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| val symbols = Array("<","-",">") val counts = Array(2,10,2) val pairs = symbols.zip(counts)
Array(("<",2),("-",10),(">",2))
for((s,n) <- pairs) print(s+" "+n)
val newMap = keys.zip(values).toMap
|