Курс 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: це сума ваг, а не кількість значень. Мультимножини й суміші стають у пригоді щоразу, коли потрібно відстежувати кількості, — наприклад, рахувати, як часто кожне слово трапляється в тексті, або призначати ваги варіантам.

Навігація курсом

Тест — Множини   |   Порахувати унікальні


💪 Або перейдіть одразу до вправ цього розділу.