Scala中的映射是键/值对的集合。任何值可以根据它的键进行检索。键是在映射唯一的,但值不一定是唯一的。映射也被称为哈希表。有两种类型的映射,不可变以及可变的。可变和不可变的对象之间的区别在于,当一个对象是不可变的,对象本身不能被改变。
默认情况下,Scala中使用不可变的映射。如果想使用可变集,必须明确地导入scala.collection.mutable.Map类。如果想在同一个同时使用可变和不可变的映射,那么可以继续参考不可变的映射作为映射,但可以参考可变集合为mutable.Map。以下是该示例声明不可变的映射如下:
// Empty hash table whose keys are strings and values are integers:
var A:Map[Char,Int] = Map()
// A map with keys and values.
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")
在定义空映射,类型注释是必要的,因为系统需要指定一个具体的类型变量。如果我们要一个键值对添加到映射,我们可以使用运算符+如下:
A += ('I' -> 1)
A += ('J' -> 5)
A += ('K' -> 10)
A += ('L' -> 100)
在映射上的所有操作可被表示在下面的三种方法:
| 方法 | 描述 |
|---|---|
| keys | 这个方法返回一个包含映射中的每个键的迭代。 |
| values | 这个方法返回一个包含映射中的每个值的迭代。 |
| isEmpty | 如果映射为空此方法返回true,否则为false。 |
以下是上述方法中的例子显示的用法:
object Test {
def main(args: Array[String]) {
val colors = Map("red" -> "#FF0000",
"azure" -> "#F0FFFF",
"peru" -> "#CD853F")
val nums: Map[Int, Int] = Map()
println( "Keys in colors : " + colors.keys )
println( "Values in colors : " + colors.values )
println( "Check if colors is empty : " + colors.isEmpty )
println( "Check if nums is empty : " + nums.isEmpty )
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Keys in colors : Set(red, azure, peru) Values in colors : MapLike(#FF0000, #F0FFFF, #CD853F) Check if colors is empty : false Check if nums is empty : true C:/>
可以使用++运算符或映射。++()方法来连接两个或更多的映射,但同时增加了映射,将删除重复的键。下面是一个例子来连接两个映射:
object Test {
def main(args: Array[String]) {
val colors1 = Map("red" -> "#FF0000",
"azure" -> "#F0FFFF",
"peru" -> "#CD853F")
val colors2 = Map("blue" -> "#0033FF",
"yellow" -> "#FFFF00",
"red" -> "#FF0000")
// use two or more Maps with ++ as operator
var colors = colors1 ++ colors2
println( "colors1 ++ colors2 : " + colors )
// use two maps with ++ as method
colors = colors1.++(colors2)
println( "colors1.++(colors2)) : " + colors )
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala
C:/>scala Test
colors1 ++ colors2 : Map(blue -> #0033FF, azure -> #F0FFFF,
peru -> #CD853F, yellow -> #FFFF00, red -> #FF0000)
colors1.++(colors2)) : Map(blue -> #0033FF, azure -> #F0FFFF,
peru -> #CD853F, yellow -> #FFFF00, red -> #FF0000)
C:/>
可以通过使用foreach循环重复Map的键和值。以下为例子来说明的用法:
object Test {
def main(args: Array[String]) {
val colors = Map("red" -> "#FF0000",
"azure" -> "#F0FFFF",
"peru" -> "#CD853F")
colors.keys.foreach{ i =>
print( "Key = " + i )
println(" Value = " + colors(i) )}
}
}
在这里,我们使用迭代器相关的foreach遍历键方法。当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Key = red Value = #FF0000 Key = azure Value = #F0FFFF Key = peru Value = #CD853F C:/>
可以使用 Map.contains 方法来测试,如果给定的键存在于映射或没有。以下为例子来说明的用法:
object Test {
def main(args: Array[String]) {
val colors = Map("red" -> "#FF0000",
"azure" -> "#F0FFFF",
"peru" -> "#CD853F")
if( colors.contains( "red" )){
println("Red key exists with value :" + colors("red"))
}else{
println("Red key does not exist")
}
if( colors.contains( "maroon" )){
println("Maroon key exists with value :" + colors("maroon"))
}else{
println("Maroon key does not exist")
}
}
}
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Red key exists with value :#FF0000 Maroon key does not exist C:/>
以下是可以使用映射的重要方法。有关可用方法的完整列表,请Scala的官方文件。
| SN | 方法及描述 |
|---|---|
| 1 |
def ++(xs: Map[(A, B)]): Map[A, B] 返回包含此映射的映射和那些xs提供了一个新的映射。 |
| 2 |
def -(elem1: A, elem2: A, elems: A*): Map[A, B] 返回包含除具有一个键等于映射elem1,elem2时或任何元素此映射的所有映射的新映射。 |
| 3 |
def --(xs: GTO[A]): Map[A, B] 返回此映射,除映射一键等于从遍历对象xs的一个键所有键/值映射的新映射。 |
| 4 |
def get(key: A): Option[B] 可选择返回一个包含键关联的值。 |
| 5 |
def iterator: Iterator[(A, B)] 创建一个新的迭代器的所有键/值对在此映射 |
| 6 |
def addString(b: StringBuilder): StringBuilder 追加可收缩集合到一个字符串生成器的所有元素。 |
| 7 |
def addString(b: StringBuilder, sep: String): StringBuilder 追加可收缩集合到使用分隔字符串一个字符串生成器的所有元素。 |
| 8 |
def apply(key: A): B 返回给定键或者映射的默认方法的结果相关联的,如果不存在值。 |
| 9 |
def clear(): Unit 从映射中删除所有绑定。在此之后操作已完成时,映射将是空的。 |
| 10 |
def clone(): Map[A, B] 创建接收器对象的副本。 |
| 11 |
def contains(key: A): Boolean 如果有一个绑定在该映射的键返回true,否则为false。 |
| 12 |
def copyToArray(xs: Array[(A, B)]): Unit 复制这个可收缩集合值的数组。填充给定的数组xs与此可收缩集合值。 |
| 13 |
def count(p: ((A, B)) => Boolean): Int 计算满足谓词在可收缩集合元素的数量。 |
| 14 |
def default(key: A): B 定义默认值计算为映射,当找不到一个键返回。 |
| 15 |
def drop(n: Int): Map[A, B] 返回除了第n个的所有元素。 |
| 16 |
def dropRight(n: Int): Map[A, B] 返回除了最后n个的所有元素 |
| 17 |
def dropWhile(p: ((A, B)) => Boolean): Map[A, B] 丢弃满足谓词的元素最长前缀。 |
| 18 |
def empty: Map[A, B] 返回相同类型的,因为这映射的空映射。 |
| 19 |
def equals(that: Any): Boolean 返回true,如果两个映射包含完全相同的键/值,否则为false。 |
| 20 |
def exists(p: ((A, B)) => Boolean): Boolean 返回true如果给定的断言p成立了一些这方面可收缩集合的元素,否则为false。 |
| 21 |
def filter(p: ((A, B))=> Boolean): Map[A, B] 返回此可收缩集合满足谓词的所有元素。 |
| 22 |
def filterKeys(p: (A) => Boolean): Map[A, B] 返回一个不可变的映射只包含那些键值对这个映射,重点满足谓词p |
| 23 |
def find(p: ((A, B)) => Boolean): Option[(A, B)] 查找可收缩集合满足谓词,任何的第一要素 |
| 24 |
def foreach(f: ((A, B)) => Unit): Unit 应用一个函数f这种可收缩集合中的所有元素 |
| 25 |
def init: Map[A, B] 返回除了最后的所有元素 |
| 26 |
def isEmpty: Boolean 测试映射是否为空 |
| 27 |
def keys: Iterable[A] 返回迭代所有键 |
| 28 |
def last: (A, B) 返回最后一个元素 |
| 29 |
def max: (A, B) 查找最大的元素 |
| 30 |
def min: (A, B) 查找最小元素 |
| 31 |
def mkString: String 显示此可收缩集合字符串中的所有元素 |
| 32 |
def product: (A, B) 返回此可收缩集合相对于所述运算符*在num所有元素的乘积 |
| 33 |
def remove(key: A): Option[B] 移除此映射一个键,返回先前与该键作为一个选项相关联的值 |
| 34 |
def retain(p: (A, B) => Boolean): Map.this.type 只保留那些映射其中谓词p返回true |
| 35 |
def size: Int 返回在此映射的元素的数量。 |
| 36 |
def sum: (A, B) 返回此可收缩集合中的所有元素的总和使用+运算符在num |
| 37 |
def tail: Map[A, B] 返回除了第一元素外的所有元素 |
| 38 |
def take(n: Int): Map[A, B] 返回前n个元素 |
| 39 |
def takeRight(n: Int): Map[A, B] 返回最后n个元素 |
| 40 |
def takeWhile(p: ((A, B)) => Boolean): Map[A, B] 满足谓词的元素最长前缀 |
| 41 |
def toArray: Array[(A, B)] 这个可收缩集合转换成数组 |
| 42 |
def toBuffer[B >: A]: Buffer[B] 返回包含此映射中的所有元素的缓冲区 |
| 43 |
def toList: List[A] 返回包含此映射中的所有元素的列表 |
| 44 |
def toSeq: Seq[A] 返回包含此映射中的所有元素的序列 |
| 45 |
def toSet: Set[A] 返回一组包含此映射中的所有元素 |
| 46 |
def toString(): String 返回对象的字符串表示 |