Scala Map[K, V]

于2017-07-06由小牛君创建

分享到:


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[


  • 在线咨询

  • 免费热线

    免费热线400-6767-088
    免费回拨
    手机请直接输入:如1392877****
    座机前加区号:如010—6974****
    入您的电话号码,点击“免费回拨”按钮稍后您将接到我们的电话,该通话对您完全免费,请放心接听!
  • 资料发放

  • 技术答疑

  • 关注微信

    小牛学堂微信公众号