[英]Perl push into a sorted array
考慮下面的數據塊,我如何維護第3個字段對數組進行排序,並繼續推送項目?
$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;
我發現這個模塊與我需要的類似。
任何幫助贊賞。
您可以使用該模塊,只需提供排序:
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
好吧,無論如何,push都會將項目附加到列表的末尾。 這是一個堆棧操作。 我會說你最好不要使用不同的數據結構,例如哈希,然后只在必要時按鍵或值排序。 如果沒有你想寫的更多細節,很難說。
否則,您需要編寫一個子程序,在列表中搜索最佳插入位置,然后使用splice將項目注入到位。 這聽起來更像你想要做的,但我不確定它會特別有效,因為每次你想要在保持排序順序的同時添加項目時必須搜索列表中的插入點。
如果要向@items添加多個數組引用,請先添加引用,然后使用Schwartzian Transform執行單個排序操作:
@items = map $_->[1], sort { $a->[0] <=> $b->[0] } map { [ $_->[2], $_ ] } @items;
蘭德爾寫了一篇專欄文章: http : //www.stonehenge.com/merlyn/UnixReview/col64.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.