繁体   English   中英

将数组引用插入Perl堆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM