2010-06-30 32 views
2

我在Perl中將二維數組引用插入我的堆中。 構建我的堆時應該如何定義'elements'屬性以便我可以正確使用我的比較函數?作爲一個數組引用在Perl堆中插入數組引用

不能使用字符串(「2.55」),而「嚴格的裁判」使用...(這意味着我可能真的要:

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 
} 

我不斷收到回這個錯誤比較我的「數字串」數值)

+0

第1部分(適用於上下文):http://stackoverflow.com/questions/3146484/secondary-order-in-heapsimple/3146526 – Ether 2010-06-30 18:00:36

回答

0

嗯,很可能是$a$b作爲字符串傳入。嘗試在分配後打印出這些變量。

從我可以從文檔看,當你通過elements => [ Array => 0 ],除非數組中的第0項是一個數組,那麼你就只能在數組的第一個插槽中比較

[Array => $index]
Indicates that the elements are array references, with the key at index $index. So now the element can be not just the key, but also associated data.

這意味着,如果2.55是像數組[2.55,...]那麼這是什麼東西被傳遞爲$a$b

elements條目告訴H::S你想如何派生密鑰。對於一個完全通用的方式,它說你可以通過[Function => $code_ref_for_key]。你可以這樣做:

sub first_two_slots { my $ array_ref = shift; return [@ $ array_ref [0,1]]; }

然後用按規定的順序,它會傳遞數組到您的訂單,並指定

my $heap = Heap::Simple->new(order  => \&byNumOrStr, 
           elements => [Function => \&first_two_slots] 
          ); 

原文評論留在地方:(這不是有關如何Heap::Simple電話訂購)。

如果byNumOrStrsort稱爲請勿在其分配$a$b。這些值由sort設置。如果@_中有某種東西出現,那可能不是你想要的。

+1

無論如何,這些是不同的變量,因爲sort的$ a和$ b是包裹可否 – 2010-06-30 17:01:06

+0

@ Leon Timmermans,我認爲這不重要。如果他將'$ a'和'$ b'詞彙化,那麼它們將嘗試引用數組,而不是符號表中的引用。 – Axeman 2010-06-30 17:04:34

+1

我不認爲'$ a'和'$ b'可以詞彙化。 'perldoc perlvar'說:「使用sort()時的特殊包變量,請參閱perlfunc中的」sort「。由於這種特殊性,$ a和$ b不需要聲明(使用使用變量或我們的())甚至當使用「strict'vars'」雜注時,如果你希望能夠在sort()比較模塊或函數中使用它們,請勿用「my $ a」或「my $ b」將它們詞彙化。 – Ether 2010-06-30 17:06:15

0

排序一個二維數組並不是真的有意義 - 當你對某物進行排序時,有一個定義的順序。有兩個排序標準並沒有使它成爲一個二維列表...你的意思是說你有兩個元素列表的數據?例如: -

my $element = [ '0', 'string' ]; 

我覺得例1的文檔中(「裏鍵和值分開保存」)適用於這裏 - 你想引用,而不是值本身進行排序。因此,嘗試用 elements => "Any"聲明,然後調整自己的排序方法,以匹配:

(我錯了..它看起來像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。正如在Secondary Order in Heap::Simple中討論的那樣,Heap :: Simple中的比較函數不需要-1,0或1的返回值,而是true或false。您需要在從函數返回之前轉換比較結果。

+0

是的,我的數據是兩個元素的列表,或者說是對該列表的引用。 – syker 2010-06-30 18:24:56

+0

此外,爲什麼你不需要指定返回0? – syker 2010-06-30 18:29:58

+0

@syker:文檔說「如果$ key1小於$ key2,則返回一個真值,否則返回一個假值。」 - 函數的返回值是評估的最後一個表達式,即與-1的比較。我可以在代碼中更清楚一點,我現在要做的。 – Ether 2010-06-30 19:04:53