Kontener map jest typem kontenera zawierającym pary klucz-wartość będące mapowaniem jednej wartości do innej. Podczas tworzenia kontenera mapy jego zawartość jest porządkowana według kolejności par klucz-wartość, a dostęp do elementów zawartych w mapie można uzyskać za pomocą zdefiniowanych unikalnych kluczy.
Aby na przykład zliczać wystąpienia konkretnego słowa, możesz utworzyć mapę, w której to słowo będzie kluczem, a liczba jego wystąpień wartością.
WordCount : [string]int = map{"apple" => 11, "pear" => 7}Kliknij ilustrację, aby ją powiększyć.
Jeśli podczas inicjacji mapy użyjesz wielokrotnie tego samego klucza, mapa zachowa jedynie ostatnią wartość podaną dla tego klucza. W poniższym przykładzie WordCount będzie mieć jedynie następującą parę klucz-wartość: "apple" => 2. Pary "apple" => 0 i "apple" => 1 zostaną odrzucone.
WordCount : [string]int = map{"apple" => 0, "apple" => 1, "apple" => 2}Obsługiwane typy kluczy
Pary klucz-wartość mogą być dowolnego typu, pod warunkiem że typ klucza jest porównywalny, ponieważ mapa musi mieć możliwość sprawdzenia, czy klucz już istnieje.
W charakterze kluczy można wykorzystać następujące typy:
Klasa (class), jeśli jest porównywalna
Opcja (option), jeśli typ elementu jest porównywalny
Tablica (array), jeśli typ elementu jest porównywalny
Mapa (map), jeśli zarówno typ klucza, jak i typ wartości są porównywalne
Krotka (tuple), jeśli wszystkie elementy w krotce są porównywalne
Długość mapy
Liczbę par klucz-wartość w mapie można odczytać z pola Length mapy. Na przykład map{"a" => "apple", "b" => "bear", "c" => "candy"}.Length zwraca 3.
Dostęp do elementów w mapie
Dostęp do elementu w mapie można uzyskać za pomocą klucza, na przykład WordCount["apple"].
Uzyskiwanie dostępu do elementu w mapie jest wyrażeniem zawodnym i może być stosowane tylko w kontekście niepowodzenia, takim jak wyrażenie if. Na przykład:
ExampleMap : [string]string = map{"a" => "apple", "b" => "bear", "c" => "candy"}
for (Key->Value : ExampleMap):
Print("{Value} in ExampleMap at key {Key}")Klucz | "a" | "b" | "c" |
Wartość | "jabłko" | "niedźwiedź" | "cukierek" |
Dodawanie i modyfikowanie elementów w mapie
Elementy do zmiennej mapy można dodać, ustawiając dla klucza w mapie konkretną wartość. Na przykład set ExampleMap["d"] = 4. Istniejące pary klucz-wartość można aktualizować w podobny sposób, przypisując wartość do klucza, który już istnieje w mapie.
Dodawanie elementu do mapy jest wyrażeniem zawodnym i może być stosowane tylko w kontekście niepowodzenia, takim jak wyrażenie if. Na przykład:
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}")Usuwanie elementów z mapy
Aby usunąć elementy ze zmiennej mapy, trzeba utworzyć nową mapę z wykluczeniem klucza, który ma zostać usunięty. Poniżej zaprezentowano przykład funkcji, która umożliwia usuwanie z map [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 NewMapSłaba mapa
Typ weak_map to nadtyp typu map. W większości przypadków weak_map używa się tak, jak używałoby się typu map, ale z następującymi wyjątkami:
Nie możesz odpytywać, ile elementów zawiera
weak_map, ponieważweak_mapnie ma elementu członkowskiegoLength.Nie możesz iterować przez elementy
weak_map.Nie możesz użyć
ConcatenateMaps()naweak_map.
Inna różnica polega na tym, że definicja typu dla weak_map wymaga zdefiniowania typów par klucz-wartość przy użyciu funkcji weak_map, takiej jak MyWeakMap:weak_map(string, int) = map{}, definiującej słabą mapę o nazwie MyWeakMap, która będzie miała klucz w postaci ciągu tekstowego sparowany z wartością całkowitą. Jako że weak_map jest nadtypem map, możesz ją zainicjować przy użyciu standardowej map{}.
Poniżej przedstawiono przykład tworzenia zmiennej weak_map i uzyskiwania dostępu do elementu w słabej mapie:
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 mapTyp możliwy do persystencji
Mapa jest persystentna, jeśli zarówno typ klucza, jak i typ wartości są możliwe do persystentne. Jeśli mapa jest persystentna, oznacza to, że możesz jej użyć w zmiennych weak_map o zasięgu modułowym i zachować ich wartości podczas sesji gry. Więcej informacji na temat persystencji w Verse znajdziesz w artykule Używanie persystentnych danych w Verse.