Перейти к основному содержимому

Соответствие

Соответствие — это коллекция пар «ключ-значение». Ключи должны быть уникальны. Каждому ключу соответствует только одно значение. Порядок обхода элементов соответствует порядку добавления элементов в соответствие. Соответствие позволяет хранить элементы произвольных типов.

Для описания ключей и их значений используется тип КлючИЗначение<ТипКлюча,ТипЗначения>, который имеет соответствующие свойства: Ключ и Значение.

Изменяемые и неизменяемые соответствия

Соответствия делятся на два вида:

Создание соответствия

Вы можете создать соответствие с помощью конструктора типа или с помощью литерала.

Элементы соответствия заключаются в символы {}. Ключ отделяется от его значения с помощью символа :, а сами пары «ключ-значение» разделяются символом ,.

// Литерал пустого соответствия
знч ПустоеСоответствие = <Строка, Число>{:}

// Литерал соответствия с элементами, хранящими ID и имя сотрудника
// Типы ключа и значения выводятся из литерала
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}

// Соответствие, содержащее элементы различных типов
знч СоответствиеОбъектов = <Объект, Объект>{"Ключ1" : 1, Истина : "Значение2"}

Создание копированием

Если необходимо создать копию какого-либо соответствия, то это можно сделать с помощью конструктора копирования. В этом случае новое соответствие будет являться полной копией исходного.

знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
знч СотрудникиКопия = новый Соответствие<Число, Строка>(Сотрудники)

Создание из массива

Используйте методы ВСоответствие(), ВСоответствиеСКлючами() и ВСоответствиеСоЗначениями() для преобразования массивов данных в соответствия.

структура Сотрудник
знч Ид: Число
пер Имя: Строка
;

метод СоздатьСотрудников()
// Заполнение массива сотрудников
знч Сотрудники = <Сотрудник>[]
Сотрудники.Добавить(новый Сотрудник(10000, "Смирнов Алексей"))
Сотрудники.Добавить(новый Сотрудник(10001, "Петров Олег"))
Сотрудники.Добавить(новый Сотрудник(10002, "Иванов Михаил"))

// Преобразование массива в соответствие
знч СотрудникиСоответствие = Сотрудники.ВСоответствие(Элемент -> Элемент.Ид, Элемент -> Элемент.Имя)
; // {10000: "Смирнов Алексей", 10001: "Петров Олег", 10002: "Иванов Михаил"}

Вставка элементов

Если на момент создания соответствия неясно, какие данные будут в нем храниться, вы можете добавить их позднее с помощью методов Вставить() или ВставитьВсе() (для вставки нескольких элементов).

знч Товары = новый Соответствие<Число, Строка>()
Товары.Вставить(1877210255, "Холодильник")
Товары.Вставить(1805231477, "Телевизор")

Если в момент вставки элемента соответствие уже содержит значение с указанным ключом, то значение в соответствии заменяется на добавляемое значение. Другими словами, в результате выполнения следующего кода значением элемента с ключом Пи будет 3.141592654, а не 3:

знч Константы: Соответствие<Строка, Число>
Константы.Вставить("Пи", 3)
Константы.Вставить("Пи", 3.141592654)

Вы также можете использовать перегрузки метода ВставитьЕслиОтсутствует(), чтобы добавить элемент в соответствие только в том случае, если ключ, указанный в методе, отсутствует в соответствии. Если ключ в соответствии уже есть, метод ВставитьЕслиОтсутствует() не будет изменять существующую пару. При выполнении проверки анализируется только значение ключа.

Доступ к элементам соответствия

Операция доступа по индексу

В этом случае в квадратных скобках [] указывается ключ, значение которого необходимо получить.

знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
знч Сотрудник = Сотрудники[10001] // "Петров Олег"

Если в соответствии не существует элемента с указанным ключом, то будет выброшено исключение. Операцию доступа по индексу можно использовать как в правой, так и в левой части инструкции присваивания. В случае использования в левой части инструкции присваивания операция работает аналогично методу Вставить().

Функциональный способ

Для обращения к элементу соответствия функциональным способом используйте один из следующих методов:

  • Получить() — возвращает значение по указанному ключу. Если соответствие не содержит заданный ключ, выбрасывается исключение.
  • ПолучитьИлиНеопределено() — возвращает значение по указанному ключу или Неопределено, если соответствие не содержит заданный ключ.
  • ПолучитьИлиУмолчание() — возвращает значение по указанному ключу. Если соответствие не содержит заданный ключ, возвращается значение по умолчанию. Значение по умолчанию может вычисляться с помощью функционального типа ВычислительУмолчания. При этом значение не вычисляется, если в конкретном вызове метода оно не требуется.
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег", 10002: "Иванов Михаил"}
знч Ид = 10001

// Получение сотрудника по ID
знч Результат1 = Сотрудники.Получить(Ид) // "Петров Олег"
знч Результат2 = Сотрудники.ПолучитьИлиНеопределено(Ид)
знч Результат3 = Сотрудники.ПолучитьИлиУмолчание<Строка>(Ид, () -> "Сотрудник с ID %{Ид} не найден.")

Обход элементов соответствия

Для обхода элементов соответствия используйте цикл для из. Каждый элемент имеет тип КлючИЗначение<ТипКлюча,ТипЗначения>, позволяющий получить доступ к ключу соответствия и его значению.

метод ПолучитьСписокСотрудников(Сотрудники: Соответствие<Число, Строка>): Массив<Строка>
знч СписокСотрудников: Массив<Строка> = []
для Сотрудник из Сотрудники
СписокСотрудников.Добавить("ID: %{Сотрудник.Ключ}, Имя: %{Сотрудник.Значение}")
;
возврат СписокСотрудников
;

В результате работы метода вернется массив, содержащий элементы вида:

[0]: "ID: 10000, Имя: Смирнов Алексей"
[1]: "ID: 10001, Имя: Петров Олег"
[2]: "ID: 10002, Имя: Иванов Михаил"

Проверка наличия элемента в соответствии

При использовании соответствия часто возникает необходимость проверить, содержит ли соответствие какой-либо ключ или значение. Выполнить такую проверку можно с помощью следующих методов:

  • Содержит() — проверяет, содержится ли указанная пара «ключ-значение» в соответствии.
  • СодержитЗначение() — проверяет, содержится ли указанное значение в соответствии.
  • СодержитКлюч() — проверяет, содержится ли указанный ключ в соответствии.
метод НайтиСотрудника(Ид: Число, Сотрудники: Соответствие<Число, Строка>): Строка
// Возвращает сотрудника по ID
если Сотрудники.СодержитКлюч(Ид)
возврат Сотрудники.Получить(Ид)
;
// Если сотрудник не найден, выбрасывается исключение
выбросить новый ИсключениеНедопустимыйАргумент("Сотрудник с ID %{Ид} не найден.")
;

Также вы можете получить фиксированную коллекцию, которая содержит ключи или значения исходного соответствия. Для выполнения этого действия используйте методы Ключи() и Значения().

Сравнение соответствий

Поддерживается сравнение соответствий на равенство или неравенство. Два соответствия считаются равными, если размеры этих соответствий совпадают, ключи одного соответствия являются ключами другого, а также попарно совпадают все значения одинаковых ключей. Допускается сравнивать значения типа Соответствие<ТипКлюча,ТипЗначения> и ЧитаемоеСоответствие<ТипКлюча,ТипЗначения>.

знч ОбычноеСоответствие = новый Соответствие<Строка, Число>({"Ключ1": 1, "Ключ2": 2})
знч ЧитаемоеСоответствие = новый ЧитаемоеСоответствие<Объект, Объект>({"Ключ2": 2, "Ключ1": 1})

знч Равны = ОбычноеСоответствие == ЧитаемоеСоответствие // Истина

Очистка соответствия

Очистка соответствия выполняется следующим образом:

  • с помощью метода Очистить(), который удаляет все элементы из соответствия;
  • с помощью метода Удалить(), который удаляет элемент с указанным ключом.
знч Сотрудники = {10000: "Смирнов Алексей", 10001: "Петров Олег"}
Сотрудники.Удалить(10000) // Удаление сотрудника "Смирнов Алексей"
Сотрудники.Очистить() // Очистка соответствия