如何在Perl中为Heap :: Simple接口定义二级排序?
答案 0 :(得分:3)
The documentation表示构造函数采用代码引用来定义 订单,所以你可以指定你喜欢的任何排序方法:
my $heap = Heap::Simple->new(order => \&sort_method);
每次需要比较两个键时,将调用给定的代码引用,如: $ less = $ code_reference->($ key1,$ key2);
如果$ key1小于$ key2且为false,则应返回true值 另有价值。 $ code_reference应该意味着总订单关系,所以它 需要传递。
通过“二级排序”我假设你的意思是如果使用第二次比较 第一个显示值相等。让我们说第一个比较是 通过“method1”方法找到的值,第二个比较是 来自“method2”的值。因此,如果通过method1值不同,则返回 结果,否则回到方法2:
sub sort_method
{
my ($val1, $val2) = @_;
my $result = ($val1->method1 <=> $val2->method1)
||
($val1->method2 <=> $val2->method2);
return 1 if $result == -1;
}
如果method1和method2返回字符串而不是数值,则只需使用
cmp
运算符代替<=>
。你可以使用任何你喜欢的东西
当操作员返回正确的值时。大多数排序功能就像使用
值-1,0和1表示value1是否小于,等于或
大于value2,但该模块喜欢1表示val1&lt; val2,所以之后
收集-1,0,1结果,如果结果为-1,则返回1(其中
value1小于value2)。
答案 1 :(得分:0)
首先,你编写一个函数,它接受你想要放入堆中的两个对象,如果第一个小于第二个,则返回true值,否则返回false。
然后将其作为coderef提供给Heap :: Simple。
Heap :: Simple文档中的示例如下:
use Heap::Simple;
sub more { return $_[0] > $_[1] }
my $heap = Heap::Simple->new(order => \&more);
$heap->insert(8, 3, 14, -1, 3);
print $heap->extract_top, " " for 1..$heap->count;
print "\n";
# Will print: 14 8 3 3 -1