Scala Map[K, V]
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映射的方法:
以下是可以使用映射的重要方法。有關可用方法的完整列表,請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 返回對象的字符串表示 |