BLOG

Go to top


ハッシュを数値で大小比較ソートして、ループ処理する

August 5, 2007 11:10 PM

ごくごく基本的なことなんだけれど一応。

例えば、以下のような集計結果処理する場合、単純にキーを基準にソートすると「 2:00~3:00 => 5件」より前に「10:00~11:00 => 13件」がくるので適切な結果表示が得られなくなります。そのため、キーか値を大小比較してソートするように設定してやる必要があります。

#!/usr/bin/perl -w

print "Content-type: text/html\n\n";

use strict;
use warnings;

my $BR = '<br />';

my %count = (
	'1:00~2:00' => '3件',
	'2:00~3:00' => '5件',
	'3:00~4:00' => '8件',
	'4:00~5:00' => '6件',
	'5:00~6:00' => '5件',
	'6:00~7:00' => '9件',
	'7:00~8:00' => '10件',
	'8:00~9:00' => '15件',
	'9:00~10:00' => '16件',
	'10:00~11:00' => '13件',
	'11:00~12:00' => '11件',
);

print "ハッシュを単純なソートでループ処理$BR";
foreach my $hour (sort(keys %count)) {
	print "$hour => $count{$hour}$BR";
}
print $BR;

print "ハッシュの「キー」で、大小比較ソートしてループ処理$BR";
foreach my $hour (sort {$a <=> $b}(keys %count)) {
	print "$hour => $count{$hour}$BR";
}
print "$BR";


print "ハッシュの「値」で、大小比較ソートしてループ処理$BR";
foreach my $hour (sort {$count{$a} <=> $count{$b}}(keys %count)) {
	print "$hour => $count{$hour}$BR";
}
print "$BR";

最後の例のように、値でソートしてやれば、件数の多いものから順にソートされることになります。キーでのソートにおいても、値でのソートにおいても、ソート順を逆にしたい時は「$a」と「$b」を逆にしてやればよいということ。「$a」と「$b」は決まり文句。

Comments


Contact me

Copyright © 2005 - 2017 okayama All rights reserved.