Словари
Словарь 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