-4

perlを使用してハッシュをソートする必要があります。

私のハッシュは:

2 nameA
5 nameB
4 nameC
2 nameD
3 nameE

結果は次のようになります。

2 nameA
2 nameD
3 nameE
4 nameC
5 nameB

どうやって?

ありがとう、

みこ

4

2 に答える 2

2

キーを並べ替えて配列に格納します。配列は順序を保持します。キーは数値だったので、ここでは数値ソートを使用しました。

my @sorted_keys = sort { $a <=> $b } keys %hash;

これで、必要に応じてそれらにアクセスできます。

print "$_ $hash{$_}\n" for @sorted_keys;

ただし、ハッシュは順序付けられていないため、ソートされた結果をハッシュに格納することはできません。2また、キーが 2 つの異なる値で表示されるハッシュを持つことはできません。設計上不可能です。

たとえば、そのデータがファイルにある場合は、シュワルツ変換を実行できます。(下から上へのコメントを読むと、意味がわかります):

open my $fh, "<", $filename or die $!;
my @sorted = map $_->[2],                   # Then map them back into the third
             sort {                     
                 $a->[0] <=> $b->[0] ||     # Sort them numerically on first
                 $a->[1] cmp $b->[1]        # ..or alphabetically on second col
             } map [ split, $_ ],           # Map them into a 3-element array ref
                 <$fh>;                     # Take all the lines in the file

ソート内の連鎖ステートメントは、2 つの値を区別できない場合に有効になります。たとえば、"2" と "2" は<=>演算子から 0 を返します。このような場合、代わりに、配列要素 1 に格納した 2 番目の列でアルファベット順にソートされます。

于 2012-12-26T14:27:29.117 に答える
0
foreach (sort keys %hash) {
  print "$_ : $hash{$_} \n";
}
于 2012-12-26T14:25:20.960 に答える