Raku中如何从已排序哈希数组中正确获取最大值?
问题分析与解决
我正在处理一个按键值排序的哈希数组,已经拆分出单独的键和值。写了一个循环遍历键值数组,用$MCNum变量跟踪哈希值,期望遇到更大的值时更新该变量,但实际运行时要么完全不更新,要么不管数值大小都更新。
我的代码
my $MCNum = 0; my @sorted_pairs = %counts{$word}.sort: *.kv; loop (my $i = 0; $i < @sorted_pairs; $i++) { say "i: ", @sorted_pairs[$i].values; say "i+1 ",@sorted_pairs[$i+1].values; if @sorted_pairs[$i].values < @sorted_pairs[$i+1].values { $MCNum = @sorted_pairs[$i+1].values; $best_word = @sorted_pairs[$i+1].keys; say "MCNumber is: ", $MCNum; } }
程序输出
Sorted Hash Array: [90's => 1 at => 1 dance => 1 did => 1 does => 1 doesn't => 1 don't => 1 droid => 1 dubwise => 1 feat => 1 hasn't => 1 if => 1 is => 5 letters => 1 life => 1 like => 1 man => 1 me => 5 monsterman => 1 my => 2 scenes => 1 sensation => 1 so => 3 song => 1 survives => 1 theme => 1 triangle => 1 weather => 1 would => 1 y'all => 1 you => 10 your => 1] i: (1) i+1 (1) i: (1) i+1 (1) ...(中间重复输出省略) i: (1) i+1 (10) i: (10) i+1 (1) i: (1) i+1 ()
问题根源
- 列表比较而非数值比较:
.values和.keys返回的是列表类型(输出中括号(1)就是证明),直接用<比较列表时,Raku会按列表的迭代规则对比,不是预期的数值大小比较,导致判断逻辑完全错误。 - 循环边界越界:当
$i遍历到数组最后一个元素时,$i+1超出数组范围,此时@sorted_pairs[$i+1].values是空列表,和任何值比较都会出问题。 - 排序逻辑不符合预期:用
*.kv排序实际是按键的字典序排序,不是按值排序,导致数组里的值乱序,后续的相邻比较完全没有意义。 - 更新逻辑错误:拿当前元素和下一个元素比较,而非拿当前元素的值和
$MCNum对比,就算排序正确,也会漏掉某些更大的值(比如多个相同大的值连续出现时)。
修复后的代码
my $MCNum = 0; my $best_word; # 按值升序排序,若要降序则换成 { $^b.value <=> $^a.value } my @sorted_pairs = %counts{$word}.sort: { $^a.value <=> $^b.value }; # 用for循环直接遍历每个键值对,更符合Raku风格 for @sorted_pairs -> $pair { my $current_value = $pair.value; my $current_key = $pair.key; if $current_value > $MCNum { $MCNum = $current_value; $best_word = $current_key; say "MCNumber is: ", $MCNum; } }
关键改进点
- 改用
$pair.value和$pair.key直接获取单个数值和键,避免列表比较的逻辑错误。 - 修正排序规则,按值排序(可根据需求选择升序或降序)。
- 采用Raku原生的
for循环遍历键值对,彻底规避数组越界问题,代码更简洁易读。 - 更新逻辑改为直接比较当前值与
$MCNum,精准匹配“遇到更大值就更新”的需求。
内容的提问来源于stack exchange,提问作者Homerian
相关产品推荐
相关产品推荐

