Perl推入排序数组

时间:2011-03-13 20:43:42

标签: arrays perl sorting

考虑下面的数据块,如何维护第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;

我找到了this模块,它类似于我需要的模块。

任何帮助表示赞赏。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

好吧,无论如何,push都会将项目附加到列表的末尾。这是一个堆栈操作。我会说你最好不要使用不同的数据结构,例如哈希,然后只在必要时按键或值排序。如果没有关于你要写的内容的更多细节,很难说。

否则,您需要编写一个子程序,在列表中搜索最佳插入位置,然后使用splice将项目注入到位。这听起来更像你想要做的,但我不确定它会特别有效,因为每次你想要在保持排序顺序时添加项目时必须在列表中搜索插入点。

答案 2 :(得分:1)

如果要向@items添加多个数组引用,请先添加引用,然后使用Schwartzian转换执行单个排序操作:

@items = map $_->[1], sort { $a->[0] <=> $b->[0] } map { [ $_->[2], $_ ] } @items;

兰德尔写了一篇专栏文章:http://www.stonehenge.com/merlyn/UnixReview/col64.html