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