簡體   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