将数组引用插入Perl堆
我正在用Perl将二维数组引用插入我的堆中。 在构建堆时,我应该如何定义'elements'属性,以便正确使用比较器函数将数组引用插入Perl堆,perl,arrays,insert,reference,Perl,Arrays,Insert,Reference,我正在用Perl将二维数组引用插入我的堆中。 在构建堆时,我应该如何定义'elements'属性,以便正确使用比较器函数 my $heap = Heap::Simple->new( order => \&byNumOrStr, elements => [Array => 0] ); sub byNumOrStr { my ( $
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
}
my$heap=heap::Simple->new(order=>\&byNumOrStr,
元素=>[数组=>0]
);
sub byNumOrStr
{
我的($a$b)=;
$b->[0]$a->[0]#第0个元素是一个数字。
||
$a->[1]cmp$b->[1];#第一个元素是一个数字
}
我不断发现这个错误:
在使用“严格引用”时,无法将字符串(“2.55”)用作数组引用。。。(这意味着我可能实际上必须以数字形式比较我的“数字字符串”)嗯,很可能是
$a
或$b
作为字符串传入。在赋值后尝试打印此变量
从文档中我可以看到,当您传递元素=>[Array=>0]
时,除非数组中的第0项是数组,否则您将只比较数组第一个插槽中的值
[Array=>$index]
指示元素是数组引用,键位于索引$index。因此,现在元素不仅可以是键,还可以是关联的数据。
这意味着如果2.55像[2.55,…]一样在数组中,那么这就是作为$a
或$b
传入的内容
elements
条目告诉H::S
您希望如何派生密钥。对于一种完全通用的方式,它说您可以传递[Function=>$code\u ref\u For\u key]
。你可以这样做:
子第一个\u两个\u插槽{
我的$array\u ref=shift;
返回[@$array_ref[0,1]];
}
然后按照指定的顺序,它会将该数组传递到您的顺序并指定
my $heap = Heap::Simple->new( order => \&byNumOrStr,
elements => [Function => \&first_two_slots]
);
保留原始注释:(这与
Heap::Simple
调用顺序无关)
如果从
sort
调用byNumOrStr
,则不要在其中分配$a
和$b
。这些值由排序设置。如果有东西进入@
中,它可能不是您想要的。嗯,很可能是$a
或$b
作为字符串传入。在赋值后尝试打印此变量
从文档中我可以看到,当您传递元素=>[Array=>0]
时,除非数组中的第0项是数组,否则您将只比较数组第一个插槽中的值
[Array=>$index]
指示元素是数组引用,键位于索引$index。因此,现在元素不仅可以是键,还可以是关联的数据。
这意味着如果2.55像[2.55,…]一样在数组中,那么这就是作为$a
或$b
传入的内容
elements
条目告诉H::S
您希望如何派生密钥。对于一种完全通用的方式,它说您可以传递[Function=>$code\u ref\u For\u key]
。你可以这样做:
子第一个\u两个\u插槽{
我的$array\u ref=shift;
返回[@$array_ref[0,1]];
}
然后按照指定的顺序,它会将该数组传递到您的顺序并指定
my $heap = Heap::Simple->new( order => \&byNumOrStr,
elements => [Function => \&first_two_slots]
);
保留原始注释:(这与
Heap::Simple
调用顺序无关)
如果从
sort
调用byNumOrStr
,则不要在其中分配$a
和$b
。这些值由排序设置。如果有什么东西进入@
中,它可能不是您想要的。对二维数组进行排序实际上没有意义——排序时,有一个定义的顺序。有两个排序标准并不能使其成为二维列表。。。你的意思是你的数据是两个元素的列表吗?e、 g:
my $element = [ '0', 'string' ];
我认为文档中的示例1(“键和值是分开的”)适用于这里——您希望对引用进行排序,而不是对值本身进行排序。因此,请尝试使用元素=>声明“Any”
,然后调整排序方法以匹配:
(我错了..看起来elements=>[Array=>0]
是正确的,因为这些只是正在排序的普通的旧arrayRef
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;
}
my$heap=heap::Simple->new(order=>\&byNumOrStr,
元素=>[Array=>0],
);
sub byNumOrStr
{
我的($val1,$val2)=@;
我的$result=
$val1->[0]$val2->[0]#第0个元素是一个数字
||
$val1->[1]cmp$val2->[1];#第一个元素是字符串
#文档说“如果$key1小于$key2,则返回真值,否则返回假值。”
返回$result==-1;
}
注:如中所述,Heap::Simple中的比较函数不希望返回值为-1、0或1,而是希望返回值为true或false。在从函数返回之前,需要转换比较结果。对二维数组进行排序实际上没有意义——排序时,有一个已定义的顺序。有两个排序标准并不能使它成为一个二维列表……您的意思是您的数据是由两个元素组成的列表吗?例如:
my $element = [ '0', 'string' ];
我认为文档中的示例1(“键和值分开的地方”)适用于这里——您希望对引用进行排序,而不是对值本身进行排序。因此,请尝试使用elements=>“Any”
,然后调整排序方法以匹配:
(我错了..看起来elements=>[Array=>0]
是正确的,因为这些只是正在排序的普通的旧arrayRef
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;
}
my$heap=heap::Simple->new(order=>\&byNumOrStr,
元素=>[Array=>0],
);
sub byNumOrStr
{
我的(