2011-03-13 120 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