首页 > 解决方案 > 通过在 Raku 中对它们的值进行分组来打印散列元素

问题描述

我会记录一个字母在一个单词中出现的次数,例如“embeddedss”

my %x := {e => 3, m => 1, b => 1, d => 3, s => 2};

我想通过像这样分组它们的值来打印元素:

# e and d 3 times
# m and b 1 times
# s 2 times

实际上如何做到这一点,即不构造循环(如果有的话)?

可选在打印哈希之前,我想将其转换并分配为临时数据结构,例如( <3 e d>, <1 m b>, <2 s> )然后打印它。最实用的数据结构和打印方式可能是什么?

标签: hashraku

解决方案


按照评论中的建议使用.categorize,您可以根据值将它们组合在一起。

%x.categorize(*.value)

这会产生一个散列,键是用于分类的值,值是来自原始散列 ( $x) 的对。这可以使用for或循环.map。您最初计算的字母是 Pairs 的关键,可以使用.map.

for %x.categorize(*.value) {
    say "{$_.value.map(*.key).join(' and ')} {$_.key} times";
}

或者,您还可以使用 . 按出现次数对列表进行排序.sort。这将首先对最小的数字进行排序,但添加一个简单.reverse的将使最高的值排在第一位。

for %x.categorize(*.value).sort.reverse {
     say "{$_.value.map(*.key).join(' and ')} {$_.key} times";
}

推荐阅读