[英]Inserting Array References into Perl Heap
我在Perl的堆中插入二维数组引用。 构造堆时如何定义“元素”属性,以便可以正确使用比较器函数?
my $heap = Heap::Simple->new( order => \&byNumOrStr,
elements => [Array => 0]
);
sub byNumOrStr
{
my ( $a, $b ) = @_;
$b->[0] <=> $a->[0] #0-th element is a number.
||
$a->[1] cmp $b->[1]; #1-st element is a number
}
我不断得到这个错误:
使用“ strict refs”时不能使用字符串(“ 2.55”)作为ARRAY ref ...(这意味着我实际上可能必须在数字上比较“ number string”)
好吧,很可能$a
或$b
作为字符串传递。 分配后尝试打印出此变量。
从文档中可以看到,当您传递elements => [ Array => 0 ]
,除非数组中的第0个项目是数组,那么您将只比较数组第一个插槽中的值 。
[Array => $index]
- 指示元素是数组引用,键为索引$ index。 因此,现在该元素不仅可以是键,还可以是关联的数据。
这意味着如果数组[2.55,...]中有2.55,那么这就是$a
或$b
传递的内容。
elements
条目告诉H::S
如何获取密钥。 对于一种完全通用的方式,它表示您可以传递[Function => $code_ref_for_key]
。 您可以这样:
sub first_two_slots {my $ array_ref = shift; 返回[@ $ array_ref [0,1]]; }
然后使用指定的订单,它将把该数组传递到您的订单中并指定
my $heap = Heap::Simple->new( order => \&byNumOrStr,
elements => [Function => \&first_two_slots]
);
保留原始注释:(与Heap::Simple
调用顺序无关)。
如果从sort
调用byNumOrStr
则不要在其中分配$a
和$b
。 这些值是按sort
设置的。 如果@_
,可能不是您想要的。
对二维数组进行排序实际上没有意义-对某项进行排序时,存在定义的顺序。 拥有两个排序条件并不能使其成为一个二维列表……您是说您拥有的数据是两个元素的列表? 例如:
my $element = [ '0', 'string' ];
我认为文档中的示例1(“键和值保持分开的位置”)在这里适用-您想对引用进行排序,而不是对值本身进行排序。
因此,尝试使用
elements => "Any"
,然后调整您的sort方法以使其匹配:
(我错了。。看起来elements => [Array => 0]
是正确的,因为它们只是被排序的普通旧arrayrefs。
my $heap = Heap::Simple->new( order => \&byNumOrStr,
elements => [Array => 0],
);
sub byNumOrStr
{
my ( $val1, $val2 ) = @_;
my $result =
$val1->[0] <=> $val2->[0] # the 0th element is a number
||
$val1->[1] cmp $val2->[1]; # the 1st element is a string
# The docs say "this should return a true value if $key1 is smaller than $key2 and a false value otherwise."
return $result == -1;
}
PS。 如Heap :: Simple中的次要顺序中所述,Heap :: Simple中的比较函数不希望返回值为-1、0或1,而是希望返回true或false。 从函数返回之前,需要转换比较结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.