Соответствие — это коллекция пар «ключ-значение». Ключи должны быть уникальны. Каждому ключу соответствует только одно значение. Порядок обхода элементов соответствует порядку добавления элементов в соответствие. Соответствие позволяет хранить элементы произвольных типов.
Для описания ключей и их значений используется тип КлючИЗначение<ТипКлюча,ТипЗначения>, который имеет соответствующие свойства: Ключ и Значение.
Изменяемые и неизменяемые соответствия
Соответствия делятся на два вида:
Создание соответствия
Вы можете создать соответствие с помощью конструктора типа или с помощью литерала.
Элементы соответствия заключаются в символы {}. Ключ отделяется от его значения с помощью символа :, а сами пары «ключ-значение» разделяются символом ,.
знч ПустоеСоответствие = <Строка, Число>{:}
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
знч СоответствиеОбъектов = <Объект, Объект>{"Ключ1" : 1, Истина : "Значение2"}
Создание копированием
Если необходимо создать копию какого-либо соответствия, то это можно сделать с помощью конструктора копирования. В этом случае новое соответствие будет являться полной копией исходного.
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
знч СотрудникиКопия = новый Соответствие<Число, Строка>(Сотрудники)
Создание из массива
Используйте методы ВСоответствие(), ВСоответствиеСКлючами() и ВСоответствиеСоЗначениями() для преобразования массивов данных в соответствия.
структура Сотрудник
знч Ид: Число
пер Имя: Строка
;
метод СоздатьСотрудников()
знч Сотрудники = <Сотрудник>[]
Сотрудники.Добавить(новый Сотрудник(10000, "Смирнов Алексей"))
Сотрудники.Добавить(новый Сотрудник(10001, "Петров Олег"))
Сотрудники.Добавить(новый Сотрудник(10002, "Иванов Михаил"))
знч СотрудникиСоответствие = Сотрудники.ВСоответствие(Элемент -> Элемент.Ид, Элемент -> Элемент.Имя)
;
Вставка элементов
Если на момент создания соответствия неясно, какие данные будут в нем храниться, вы можете добавить их позднее с помощью методов Вставить() или ВставитьВсе() (для вставки нескольких элементов).
знч Товары = новый Соответствие<Число, Строка>()
Товары.Вставить(1877210255, "Холодильник")
Товары.Вставить(1805231477, "Телевизор")
Если в момент вставки элемента соответствие уже содержит значение с указанным ключом, то значение в соответствии заменяется на добавляемое значение. Другими словами, в результате выполнения следующего кода значением элемента с ключом Пи будет 3.141592654, а не 3:
знч Константы: Соответствие<Строка, Число>
Константы.Вставить("Пи", 3)
Константы.Вставить("Пи", 3.141592654)
Вы также можете использовать перегрузки метода ВставитьЕслиОтсутствует(), чтобы добавить элемент в соответствие только в том случае, если ключ, указанный в методе, отсутствует в соответствии. Если ключ в соответствии уже есть, метод ВставитьЕслиОтсутствует() не будет изменять существующую пару. При выполнении проверки анализируется только значение ключа.
Доступ к элементам соответствия
Операция доступа по индексу
В этом случае в квадратных скобках [] указывается ключ, значение которого необходимо получить.
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
знч Сотрудник = Сотрудники[10001]
Если в соответствии не существует элемента с указанным ключом, то будет выброшено исключение. Операцию доступа по индексу можно использовать как в правой, так и в левой части инструкции присваивания. В случае использования в левой части инструкции присваивания операция работает аналогично методу Вставить().
Функциональный способ
Для обращения к элементу соответствия функциональным способом используйте один из следующих методов:
Получить() — возвращает значение по указанному ключу. Если соответствие не содержит заданный ключ, выбрасывается исключение.
ПолучитьИлиНеопределено() — возвращает значение по указанному ключу или Неопределено, если соответствие не содержит заданный ключ.
ПолучитьИлиУмолчание() — возвращает значение по указанному ключу. Если соответствие не содержит заданный ключ, возвращается значение по умолчанию. Значение по умолчанию может вычисляться с помощью функционального типа ВычислительУмолчания. При этом значение не вычисляется, если в конкретном вызове метода оно не требуется.
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег", 10002: "Иванов Михаил"}
знч Ид = 10001
знч Результат1 = Сотрудники.Получить(Ид)
знч Результат2 = Сотрудники.ПолучитьИлиНеопределено(Ид)
знч Результат3 = Сотрудники.ПолучитьИлиУмолчание<Строка>(Ид, () -> "Сотрудник с ID %{Ид} не найден.")
Обход элементов соответствия
Для обхода элементов соответствия используйте цикл для из. Каждый элемент имеет тип КлючИЗначение<ТипКлюча,ТипЗначения>, позволяющий получить доступ к ключу соответствия и его значению.
метод ПолучитьСписокСотрудников(Сотрудники: Соответствие<Число, Строка>): Массив<Строка>
знч СписокСотрудников: Массив<Строка> = []
для Сотрудник из Сотрудники
СписокСотрудников.Добавить("ID: %{Сотрудник.Ключ}, Имя: %{Сотрудник.Значение}")
;
возврат СписокСотрудников
;
В результате работы метода вернется массив, содержащий элементы вида:
[0]: "ID: 10000, Имя: Смирнов Алексей"
[1]: "ID: 10001, Имя: Петров Олег"
[2]: "ID: 10002, Имя: Иванов Михаил"
Проверка наличия элемента в соответствии
При использовании соответствия часто возникает необходимость проверить, содержит ли соответствие какой-либо ключ или значение. Выполнить такую проверку можно с помощью следующих методов:
Содержит() — проверяет, содержится ли указанная пара «ключ-значение» в соответствии.
СодержитЗначение() — проверяет, содержится ли указанное значение в соответствии.
СодержитКлюч() — проверяет, содержится ли указанный ключ в соответствии.
метод НайтиСотрудника(Ид: Число, Сотрудники: Соответствие<Число, Строка>): Строка
если Сотрудники.СодержитКлюч(Ид)
возврат Сотрудники.Получить(Ид)
;
выбросить новый ИсключениеНедопустимыйАргумент("Сотрудник с ID %{Ид} не найден.")
;
Также вы можете получить фиксированную коллекцию, которая содержит ключи или значения исходного соответствия. Для выполнения этого действия используйте методы Ключи() и Значения().
Сравнение соответствий
Поддерживается сравнение соответствий на равенство или неравенство. Два соответствия считаются равными, если размеры этих соответствий совпадают, ключи одного соответствия являются ключами другого, а также попарно совпадают все значения одинаковых ключей. Допуск ается сравнивать значения типа Соответствие<ТипКлюча,ТипЗначения> и ЧитаемоеСоответствие<ТипКлюча,ТипЗначения>.
знч ОбычноеСоответствие = новый Соответствие<Строка, Число>({"Ключ1": 1, "Ключ2": 2})
знч ЧитаемоеСоответствие = новый ЧитаемоеСоответствие<Объект, Объект>({"Ключ2": 2, "Ключ1": 1})
знч Равны = ОбычноеСоответствие == ЧитаемоеСоответствие
Очистка соответствия
Очистка соответствия выполняется следующим образом:
- с помощью метода
Очистить(), который удаляет все элементы из соответствия;
- с помощью метода
Удалить(), который удаляет элемент с указанным ключом.
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
Сотрудники.Удалить(10000)
Сотрудники.Очистить()