0

私の兄弟は、何千ものアイテム ID と、次の方法で販売されたアイテムの数を持っています。

    $VAR1 = {
              'sold_times' => 4,
              'item_id' => 1,
            };

    $VAR2 = {
              'sold_times' => 1,
              'item_id' => 2,
            };
    ...

この情報は、ログの読み取りから得られます。Perl では、このデータは次のように定義されます。

    my @items_ids_sold_count_map = 
    map( { sold_times => $item_id_sold_count_map{$_}, item_id => $_,}, @items_ids);

$item_id_sold_count_map はハッシュで、@items_ids はそのハッシュのキーです。参考までに、前に述べたように、ハッシュはログ ファイルの読み取りから取得されます。

    open my $infile, "<", $file_location or die("$!: $file_location");
    while (<$infile>) {
        if (/item_id:(\d+)\s*,\s*sold/) {
            $item_id_sold_count_map{$1}++;
        }
    }
    close $infile;

ランキングで紹介したいと思います。基準は、降順の「sold_items」になります。たとえば、次のようなデータ構造で提示することが頭に浮かびます。

    $VAR1 = { 'position' => 1, 'info' => { 'item_id' => 1, 'sold_items' => 4 },
              'position' => 2, 'info' => { 'item_id' => 2, 'sold_items' => 1 }, ... };

このデータ構造を作成するにはどうすればよいですか? 「最良の」方法を正確に探しているわけではありませんが、約 500,000 の項目があります。

4

1 に答える 1

1

追加レベルのハッシュを追加することなく、配列を直接ソートできるはずです。何かのようなもの:

my @ranked = sort { $a->{sold_items} <=> $b->{sold_items} } @items_ids_sold_count_map;

ここでの考え方は、各要素のハッシュ フィールドを比較して、並べ替え順序を決定することです。'a' と 'b' を切り替えて、昇順と降順を切り替えることができます。

于 2013-06-09T17:30:39.987 に答える