Курс языка программирования 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; # 5

Mix — это та же идея, что и мультимножество, только счётчики (называемые весами) могут быть дробными, а не только целыми числами. Чтобы задать веса явно, сопоставьте каждое значение с его весом в виде пары и преобразуйте список с помощью .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 — это сумма весов, а не количество значений. Мультимножества и смеси удобны, когда нужно отслеживать количества — например, подсчитывать, сколько раз каждое слово встречается в тексте, или назначать веса вариантам.

Навигация по курсу

Тест — Множества   |   Подсчёт уникальных


💪 Или перейдите сразу к упражнениям этого раздела.