1

次の構造 %hash があります。

$VAR1 = {
           1 => 5,
           3 => 1,
           2 => 4,
           4 => 9,

        };

このハッシュのキーは id を表し、値はアクセス数を表します: id => アクセス数

これをアクセス数で降順にソートし、別のハッシュに格納したい。しかし、今回は値をIDにしたいと思います。キーはランキングでの位置である必要があります:レーキングでの位置 (1 から n) => id

この特定のケースでは:

$VAR2 = {
           1 => 4,
           2 => 1,
           3 => 2,
           4 => 3,
        };

どうすればいいですか?

4

3 に答える 3

2

foreach ループで sort を使用できます。

my %hash = (
1 => 5,
3 => 1,
2 => 4,
4 => 9,
);

my %hash2;
my $count = 1;
foreach my $key(sort{$hash{$b} <=> $hash{$a}} keys %hash){
    $hash2{$count++} = $key;
}

use Data::Dumper;
print Dumper(\%hash2);

また

Davidが述べたように、マップを使用してループを実行できます。簡単にするために foreach を追加しました。

my %hash2 = map {$count++ => $_} sort{$hash{$b} <=> $hash{$a}} keys %hash;
于 2013-05-31T05:27:56.813 に答える
2

次のコードは、それぞれの値に基づいてキー (id) を並べ替え、それらのキーをランキングにマップします。

use Data::Dumper;

my %old_hash = (
  1 => 5,
  3 => 1,
  2 => 4,
  4 => 9,
);

my $rank = 1;

my %new_hash
  = map  { $rank++ => $_ }
    sort { $old_hash{$b} <=> $old_hash{$a} }
    keys %old_hash;

print Dumper \%new_hash;

map/sort/keys コンストラクトを逆に読むと理解しやすいです。

最初にすべてのキーをリストし、2 番目にそれらがインデックスする値でソートし、3 番目に、キーが現在のランクであり、値が関連付けられた ID である新しいハッシュをマップします。

于 2013-05-31T05:32:55.123 に答える
0

ID を並べ替えたいので、次のようになります。

my @ids_by_desc_access =
   sort { ... }
      keys(%accesses_by_id);

アクセス数の降順で並べ替えたいので、その比較を追加します。

my @ids_by_desc_access =
   sort { $accesses_by_id{$b} <=> $accesses_by_id{$a} }
      keys(%accesses_by_id);

最後に、奇妙なことに、ハッシュを配列として使用したいとします。

my %ids_by_desc_access =
   map { $_+1 => $ids_by_desc_access[$_] }
      0..$#ids_by_desc_access;
于 2013-05-31T19:19:44.310 に答える