2011-03-13 118 views
7

考慮下面的數據塊,我該如何維護第三個字段對數組進行排序,並繼續推送項目?Perl推入排序數組

$VAR1 = [ 
      '1111', 
      'http://...', 
      3  #this is one of the 3rd field mentioned above 
     ]; 
$VARN = [ 
      '5555', 
      'http://...', 
      0 
     ]; 


我的代碼如下所示:

my @curItem = ($item->{id}, $item->{href}, getTotal($item->{id})); 
push @items, \@curItem; 

我發現this模塊類似於我所需要的。

任何幫助表示讚賞。

回答

8

您可以使用該模塊,您只需要提供排序:

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] };

(或者類似的規定......我得查它基本上,你需要根據你傳遞的數組ref的元素排序)

編輯:是的,這適用於你的數據。只是檢查了它:

use Tie::Array::Sorted; 

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] }; 

push @a, [ "1111", "http:// ...", 3]; 
push @a, [ "5555", "http:// ...", 0]; 

foreach $ref (@a) 
{ 
    print $ref . "\n"; 
    print "@$ref \n"; 
} 

輸出:

ARRAY(0x9130888) 
5555 http:// ... 0 
ARRAY(0x90dd818) 
1111 http:// ... 3 
3

好,推是要在項目追加到列表的末尾不管。這是一個堆棧操作。我會說你可能會更好地使用不同的數據結構,如散列,然後在必要時只按鍵或值排序。沒有關於你想寫什麼的更多細節,很難說。

否則,您需要編寫一個子程序,該子程序在列表中搜索最佳插入位置,然後使用拼接將該項目注入到位。這聽起來更像你想做的事情,但我不確定它會非常有效,因爲每次你想添加一個項目時,你必須在列表中搜索插入點,同時保持排序順序。

+0

同意。問題是要求在邏輯上不一致的東西;你不能同時按照特定的排序順序*和*'push'將數組保存到它上面,因爲按照定義,'push'根據它們添加的順序存儲項目,而不是基於它們的內容。至於執行排序插入的效率,排序時的排序數據是對其進行排序的最快方法之一,此外,它避免了每次訪問數據時都需要重新排序,因此它將贏得「排序」在絕大多數情況下獲得。 – 2011-03-14 10:49:23