Курс языка программирования Raku / Продвинутый уровень / Подробнее о встроенных типах / Множества, мультимножества и смеси
Мультимножества и смеси
Множество запоминает лишь то, присутствует ли значение.
Иногда также нужно знать, сколько раз оно встречается. Именно
для этого существует Bag: он хранит счётчик для каждого
значения.
Мультимножество создаётся с помощью подпрограммы bag.
Повторяющиеся значения не схлопываются — они подсчитываются:
my $b = bag(<a b a c a>);
say $b<a>; # 3
say $b<b>; # 1Обращение к мультимножеству по значению с помощью операции
индексирования < > возвращает количество вхождений
этого значения. Метод total возвращает сумму всех
счётчиков:
say bag(<a b a c a>).total; # 5Mix — это та же идея, что и мультимножество, только
счётчики (называемые весами) могут быть дробными, а не только
целыми числами. Чтобы задать веса явно, сопоставьте каждое значение с
его весом в виде пары и преобразуйте список с помощью
.Mix:
my $m = (flour => 2.5, sugar => 0.75).Mix;
say $m<flour>; # 2.5
say $m.total; # 3.25Получение веса с помощью < > и суммирование с
помощью total работают точно так же, как для
мультимножества, — только числа не обязаны быть целыми. Здесь
total складывает веса 2.5 и 0.75,
давая 3.25 — это сумма весов, а не количество значений.
Мультимножества и смеси удобны, когда нужно отслеживать количества —
например, подсчитывать, сколько раз каждое слово встречается в тексте,
или назначать веса вариантам.
Навигация по курсу
← Тест — Множества | Подсчёт уникальных →
💪 Или перейдите сразу к упражнениям этого
раздела.