English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala Map(映射)

Сборники Scala

Map(映射)是一种可迭代的键值对(key/value)结构。

所有的值都可以通过键来获取。

Map 中的键都是唯一的。

Map 也叫哈希表(Hash tables)。

Map 有两种类型,可变与不可变,区别在于可变对象可以修改它,而不可变对象不可以。

默认情况下 Scala 使用不可变 Map。如果你需要使用可变集合,你需要显式的引入 import scala.collection.mutable.Map

在 Scala 中 你可以同时使用可变与不可变 Map,不可变的直接使用 Map,可变的使用 mutable.Map。以下示例演示了不可变 Map 的应用:

// 空哈希表,键为字符串,值为整型
var A:Map[Char,Int] = Map()
// Map 键值对演示
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")

定义 Map 时,需要为键值对定义类型。如果需要添加 key-value 对,可以使用 + 号,如下所示:

A += ('I' -> 1)
A += ('J' -> 5)
A += ('K' -> 10)
A += ('L' -> 100)

Map 基本操作

Scala Map 有三个基本操作:

方法描述
keys返回 Map 所有的键(key)
values返回 Map 所有的值(value)
isEmpty在 Map 为空时返回true

在线示例

以下示例演示了以上三个方法的基本应用:

object Test {
   def main(args: Array[String]) {
      val colors = Map("red" -> "#FF0000",
                       "azure" -> "#F0FFFF",
                       "перu" -> "#CD853F")
      val nums: Map[Int, Int] = Map()
      println("Ключи в colors : " + colors.keys)
      println("Значения в colors : " + colors.values)
      println("Проверка, пуст ли colors : " + colors.isEmpty())
      println("Проверка, пуст ли nums : " + nums.isEmpty())
   }
}

Выполнение вышеуказанного кода, результат вывода:

$ scalac Test.scala 
$ scala Test
Ключи в colors : Set(красный, azure, перу)
Значения в colors : MapLike(#FF0000, #F0FFFF, #CD853F)
Проверка, пуст ли colors : false
Проверка, пуст ли nums : true

Объединение Map

Вы можете использовать ++ оператор или Map.++() Метод для объединения двух Map, при объединении Map удаляются повторяющиеся ключи. Ниже приведен пример объединения двух Map:

object Test {
   def main(args: Array[String]) {
      val colors1 = Map("красный" -> "#FF0000",
                        "azure" -> "#F0FFFF",
                        "перu" -> "#CD853F")
      val colors2 = Map("голубой" -> "#0033FF",
                        "желтый" -> "#FFFF00",
                        "красный" -> "#FF0000")
      // ++ как оператор
      var colors = colors1 ++ colors2
      println("colors1 ++ colors2 : " + colors)
      // ++ как метод
      colors = colors1.++(colors2)
      println("colors1.++(colors2) : " + colors)
   }
}

Выполнение вышеуказанного кода, результат вывода:

$ scalac Test.scala 
$ scala Test
colors1 ++ colors2 : Map(голубой -> #0033FF, azure -> #F0FFFF, перу -> #CD853F, желтый -> #FFFF00, красный -> #FF0000)
colors1.++(colors2) : Map(голубой -> #0033FF, azure -> #F0FFFF, перу -> #CD853F, желтый -> #FFFF00, красный -> #FF0000)

Вывод keys и values из Map

Ниже через цикл foreach выводятся keys и values из Map:

object Test {
   def main(args: Array[String]) {
      val sites = Map("w3codebox" -> "http://ru.oldtoolbag.com",
                       "baidu" -> "http://www.baidu.com",
                       "taobao" -> "http://www.taobao.com"
      sites.keys.foreach{i =>  
                           print("Key = " + i)
                           println("Value = " + sites(i))
   }
}

Выполнение вышеуказанного кода, результат вывода:

$ scalac Test.scala 
$ scala Test
Key = w3codebox Value = http://ru.oldtoolbag.com
Key = baidu Value = http://www.baidu.com
Key = taobao Value = http://www.taobao.com

для проверки наличия заданного ключа в Map

Вы можете использовать Map.contains метода для проверки наличия заданного ключа в Map. Пример приведен ниже:

object Test {
   def main(args: Array[String]) {
      val sites = Map("w3codebox" -> "http://ru.oldtoolbag.com",
                       "baidu" -> "http://www.baidu.com",
                       "taobao" -> "http://www.taobao.com"
      if (sites.contains("w3codebox")) {
           println("Ключ w3codebox существует, соответствующее значение: " + sites("w3codebox"))
      } else {
           println("Ключ w3codebox не существует")
      }
      if (sites.contains("baidu")) {
           println("Ключ baidu существует, соответствующее значение: " + sites("baidu"))
      } else {
           println("Ключ baidu не существует")
      }
      if (sites.contains("google")) {
           println("Ключ google существует, соответствующее значение: " + sites("google"))
      } else {
           println("Ключ google не существует")
      }
   }
}

Выполнение вышеуказанного кода, результат вывода:

$ scalac Test.scala 
$ scala Test
ключ w3codebox существует, соответствующее значение :http://ru.oldtoolbag.com
ключ baidu существует, соответствующее значение :http://www.baidu.com
ключ google не существует

методы Scala Map

в таблице приведены常用 методы Scala Map:

номерметоды и описание
1

def ++(xs: Map[(A, B)]): Map[A, B]

возвращает новый Map, состоящий из нового Map xs

2

def -(elem1: A, elem2: A, elems: A*): Map[A, B]

возвращает новый Map, удаляя key elem1, elem2 или другие elems.

3

def --(xs: GTO[A]): Map[A, B]

возвращает новый Map, удаляя соответствующий объект xs key

4

def get(key: A): Option[B]

возвращает значение указанного ключа

5

def iterator: Iterator[(A, B)]

создание нового итератора и вывод key/value пар

6

def addString(b: StringBuilder): StringBuilder

добавление всех элементов из Map в StringBuilder, можно добавить разделитель

7

def addString(b: StringBuilder, sep: String): StringBuilder

добавление всех элементов из Map в StringBuilder, можно добавить разделитель

8

def apply(key: A): B

возвращает значение указанного ключа, если ключ не существует,возвращает метод по умолчанию Map

9

def clear(): Unit

очистка Map

10

def clone(): Map[A, B]

копирование из одного Map в другой Map

11

def contains(key: A): Boolean

возвращает true, если в Map существует указанный ключ,否则 возвращает false.

12

def copyToArray(xs: Array[(A, B)]): Unit

копирование набора в массив

13

def count(p: ((A, B)) => Boolean): Int

расчет количества элементов набора, удовлетворяющих заданным условиям

14

def default(key: A): B

Определение defaultValue для Map, возвращаемого при отсутствии ключа

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]

Отбрасывание элементов слева направо, пока условие p не станетfalse

18

def empty: Map[A, B]

Возвращает пустой Map с таким же типом

19

def equals(that: Any): Boolean

Возвращает true, если два Map равны (ключи/значения равны), в противном случае возвращает false

20

def exists(p: ((A, B)) => Boolean): Boolean

Определение существует ли элемент набора, удовлетворяющий заданным условиям

21

def filter(p: ((A, B))=> Boolean): Map[A, B]

Возврат всех наборов, удовлетворяющих заданным условиям

22

def filterKeys(p: (A) => Boolean): Map[A, B]

Возврат неизменяемого Map, удовлетворяющего заданным условиям

23

def find(p: ((A, B)) => Boolean): Option[(A, B)]

Поиск первого элемента набора, удовлетворяющего заданным условиям

24

def foreach(f: ((A, B)) => Unit): Unit

Применение функции ко всем элементам набора

25

def init: Map[A, B]

Возврат всех элементов, кроме последнего

26

def isEmpty: Boolean

Проверка, пуст ли Map

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)

Возврат произведения элементов набора

33

def remove(key: A): Option[B]

Удаление указанного ключа

34

def retain(p: (A, B) => Boolean): Map.this.type

Вернуть true, если удовлетворяет условию

35

def size: Int

Вернуть количество элементов в Map

36

def sum: (A, B)

Вернуть сумму всех числовых элементов в собрании

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]

Вернуть буфер, который содержит все элементы Map

43

def toList: List[A]

Вернуть List, который содержит все элементы Map

44

def toSeq: Seq[A]

Вернуть Seq, который содержит все элементы Map

45

def toSet: Set[A]

Вернуть Set, который содержит все элементы Map

46

def toString(): String

Вернуть объект строки

Более подробную информацию можно найти Документация API

Сборники Scala