Словари

Словарь Dictionary<TKey,TValue> хранит пары «ключ — значение» и обеспечивает быстрый доступ к значению по ключу.

Словарь «слово — перевод»

Словарь удобно использовать для хранения соответствий между значениями, например между словом и его переводом.

begin
  var d := Dict(
    'cat' to 'кот',
    'dog' to 'собака',
    'book' to 'книга'
  );

  Println(d['cat']);
  Println(d['book']);
end.

Результат:

кот
книга

Пустой словарь

Пустой словарь можно создать с помощью универсального инициализатора коллекции [], явно указав типы ключа и значения.

begin
  var d: Dictionary<string,integer> := [];

  Print(d);
end.

Результат:

{}

Добавление и изменение значения

Присваивание по новому ключу добавляет пару в словарь, а по существующему ключу изменяет его значение.

begin
  var d: Dictionary<string,integer> := [];

  d['Анна'] := 1;
  d['Борис'] := 3;

  d['Анна'] += 1;

  Println(d);
  d.Println;
end.

Результат:

{(Анна,2),(Борис,3)}
(Анна,2) (Борис,3)

Внешний Print выводит словарь в фигурных скобках как набор пар «ключ — значение», а метод Print выводит пары через пробел.

Копирование словаря

Функция Copy создаёт независимую копию словаря. При обычном присваивании две переменные ссылаются на один и тот же словарь.

begin
  var d1 := Dict(
    'Анна' to 2,
    'Борис' to 3
  );

  var d2 := Copy(d1);
  var d3 := d1;

  d2['Анна'] := 10;
  d3['Борис'] := 20;

  Println(d1);
  Println(d2);
  Println(d3);
end.

Результат:

{(Анна,2),(Борис,20)}
{(Анна,10),(Борис,3)}
{(Анна,2),(Борис,20)}

Поиск ключа

Операция in позволяет проверить, имеется ли заданный ключ в словаре.

begin
  var d := Dict(
    'Анна' to 20,
    'Борис' to 18,
    'Вера' to 21
  );

  Println('Анна' in d);
  Println('Олег' in d);
end.

Результат:

True
False

Удаление элемента

Метод Remove удаляет из словаря пару с заданным ключом. Если такого ключа нет, словарь не изменяется.

begin
  var d := Dict(
    'Анна' to 20,
    'Борис' to 18,
    'Вера' to 21
  );

  d.Remove('Борис');

  Println('Борис' in d);
end.

Результат:

False

Количество пар

Свойство Count возвращает количество пар «ключ — значение» в словаре.

begin
  var d := Dict(
    'Анна' to 20,
    'Борис' to 18,
    'Вера' to 21
  );

  Println(d.Count);
end.

Результат:

3

Ключи и значения

Свойства Keys и Values позволяют отдельно получить все ключи и все значения словаря.

begin
  var d := Dict(
    'Анна' to 20,
    'Борис' to 18,
    'Вера' to 21
  );

  d.Keys.Println;
  d.Values.Println;

  Println(d.Values.Max);
end.

Результат:

Анна Борис Вера
20 18 21
21

Перебор словаря

Цикл foreach позволяет перебрать все пары «ключ — значение» словаря.

begin
  var d := Dict(
    'cat' to 'кот',
    'dog' to 'собака',
    'book' to 'книга'
  );

  foreach var p in d do
    Println($'{p.Key} — {p.Value}');

  // То же - с распаковкой
  foreach var (key,value) in d do
    Println($'{key} — {value}');  
end.

Результат:

cat — кот
dog — собака
book — книга

cat — кот
dog — собака
book — книга

Подсчёт частот

Словарь удобно использовать для подсчёта количества появлений каждого элемента.

begin
  var a := [3,1,2,3,2,3,1];
  var d: Dictionary<integer,integer> := [];

  foreach var x in a do
    if x in d then
      d[x] += 1
    else d[x] := 1;

  Print(d);
end.

Результат:

{(3,3),(1,2),(2,2)}

Ту же задачу можно решить готовой операцией EachCount.

begin
  var a := [3,1,2,3,2,3,1];

  var d: Dictionary<integer,integer> := a.EachCount;

  Print(d);
end.

Словарь массивов

Значением словаря может быть массив; например, для каждого студента можно хранить массив его оценок.

begin
  var studentGrades: Dictionary<string,array of integer> := Dict(
    'Иван' to    [5,4,4,3],
    'Мария' to   [4,4,5,5],
    'Алексей' to [3,3,4,4],
    'Ольга' to   [5,5,5,4]
  );

  foreach var p in studentGrades do
    Println($'{p.Key}: {p.Value.Average:f2}');
end.

Результат:

Иван: 4.00
Мария: 4.50
Алексей: 3.50
Ольга: 4.75