English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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)
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:
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)
Ниже через цикл 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.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:
номер | методы и описание |
---|---|
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