map представляет собой контейнерный тип, который содержит пару «ключ-значение», в которых одно значение привязано к другому. Элементы в ассоциативном массиве упорядочены на основании порядка пар «ключ-значение» при создании массива, и вы получаете доступ к элементам в данном массиве по уникальным ключам, которые определяете сами.
Например, если вы хотите вести подсчёт того, сколько раз встретилось то или иное слово, можно создать ассоциативный массив, используя слово в качестве ключа, а в качестве значения — количество таких слов .
WordCount : [string]int = map{"apple" => 11, "pear" => 7}Нажмите на изображение, чтобы увеличить его.
Если при инициализации ассоциативного массива вы используете один и тот же ключ несколько раз, то для него сохраняется только последнее значение. В примере ниже переменная WordCount будет содержать только пару "яблоко" => 2. Пары "яблоко" => 0 и "яблоко" => 1 будут перезаписаны.
WordCount : [string]int = map{"apple" => 0, "apple" => 1, "apple" => 2}Поддерживаемые типы ключей
Переменные в парах «ключ-значение» могут быть любого типа при условии, что для ключа можно выполнить операцию сравнения, так как должен быть способ проверить, существует ли такой ключ в массиве.
В качестве ключей могут использоваться переменные следующих типов:
Класс, если для него можно выполнить сравнение
option, если для типа элемента можно выполнить сравнение
Массив, если для типа элемента можно выполнить сравнение
Ассоциативный массив, если как для ключа, так и для значения можно выполнить сравнение
Кортеж, если для всех его элементов можно выполнить сравнение
Размер ассоциативного массива
Количество пар «ключ-значение» в массиве можно получить, обратившись к полю Length данного массива. Например, map{"a" => "apple", "b" => "bear", "c" => "candy"}.Length возвращает 3.
Доступ к элементам ассоциативного массива
Доступ к элементам ассоциативного массива выполняется по ключам, например WordCount["яблоко"].
Выражение для доступа к элементу массива является выражением с неоднозначным результатом и может использоваться только в контексте, допускающем неоднозначность, таком, как выражение if. Пример:
ExampleMap : [string]string = map{"a" => "apple", "b" => "bear", "c" => "candy"}
for (Key->Value : ExampleMap):
Print("{Value} in ExampleMap at key {Key}")Ключ | "a" | "b" | "c" |
Значение | "яблоко" | "медведь" | "сладость" |
Добавление и изменение элементов в ассоциативном массиве
Вы можете добавлять элементы в ассоциативный массив, задавая желаемое значение для ключа в массиве. Пример: set ExampleMap["d"] = 4. Имеющиеся пары «ключ-значение» в ассоциативном массиве можно обновлять, задавая новое значение для ключа.
Добавление элемента в массив является выражением с неоднозначным результатом и может использоваться только в контексте, допускающем неоднозначность, таком, как выражениеif. Пример:
var ExampleMap : [string]int = map{"a" => 1, "b" => 2, "c" => 3}
# Modifying an existing element
if (set ExampleMap["b"] = 3, ValueOfB := ExampleMap["b"]):
Print("Updated key b in ExampleMap to {ValueOfB}")
# Adding a new element
if (set ExampleMap["d"] = 4, ValueOfD := ExampleMap["d"]):
Print("Added a new key-value pair to ExampleMap with value {ValueOfD}")Удаление элементов из ассоциативного массива
При удалении элементов из ассоциативного массива создаётся новый ассоциативный массив, который не содержит удалённые элементы. Ниже приведён пример функции, удаляющей элементы из ассоциативного массива [string]int.
# Removes an element from the given map and returns a new map without that element
RemoveKeyFromMap(ExampleMap:[string]int, ElementToRemove:string):[string]int=
var NewMap:[string]int = map{}
# Concatenate Keys from ExampleMap into NewMap, excluding ElementToRemove
for (Key -> Value : ExampleMap, Key <> ElementToRemove):
set NewMap = ConcatenateMaps(NewMap, map{Key => Value})
return NewMapСлабый ассоциативный массив
Тип weak_map является супертипом типа map. В большинстве случаев weak_map используется так же, как тип map, но со следующими исключениями:
Нельзя запросить количество элементов массива
weak_map, поскольку вweak_mapотсутствует членLength.Элементы массива
weak_mapперебирать нельзя.Для
weak_mapнельзя использоватьConcatenateMaps().
Разница также в том, что для определения типа weak_map нужно определить типы в паре «ключ-значение» с помощью функции weak_map, например MyWeakMap:weak_map(string, int) = map{}. Здесь определён слабый ассоциативный массив MyWeakMap, в котором строковый ключ сопряжён с целочисленным значением. Поскольку weak_map является супертипом типа map, его можно инициализировать с помощью обычного перечисления пар map{}.
Далее приведён пример создания переменной weak_map и обращения к элементу в слабом ассоциативном массиве:
ExampleFunction():void=
var MyWeakMap:weak_map(int, int) = map{} # Supertype of the standard map, so it can be assigned from the standard map
if:
set MyWeakMap[0] = 1 # Same means of mutation of a particular element as the standard map
then:
if (Value := MyWeakMap[0]):
Print("Value of map at key 0 is {Value}")
set MyWeakMap = map{0 => 2} # Same means of mutation of the entire map as the standard mapСохраняемый тип
Ассоциативный массив является сохраняемым, если типы ключа и значения являются сохраняемыми. Сохраняемый ассоциативный массив означает, что вы можете использовать его в переменных weak_map, входящих в область видимости модуля, и его значения будут сохраняться в течение всех игровых сеансов. Подробнее о сохраняемых элементах в Verse см. в разделе Использование сохраняемых данных в Verse.