K1's ManiYac Blog
徹底的に無料で使えて実用的なフリーソフトの紹介です
随時更新が面倒なのでBlog形式で更新いたします

 
徹底的に無料で使えて実用的なフリーソフトの紹介です
<< k1s - Perl 覚書の記事
2007年 8月 8日 (水)

cgi(perl)でのsort(ソート)記述の仕方

by k1s

しばらくすると忘れそうなのでperlでのsortする場合の記述をメモしておきます

頻繁に必要になりそうな形です
 2次配列で特定の項目で並べ替える場合

@LIST = ('A,7,佐藤',
'B,6,佐々木',
'A,4,高橋',
'C,5,田中',
'B,2,川口',
'C,1,雨宮',
'A,3,吉田');

2番目の要素(数字)で昇順で並べ替え
@LIST = map {$_->[0]} sort {$a->[2] <=> $b->[2]} map {[$_, split /,/]} @LIST;

3番目の要素(名前)で降順で並べ替え
@LIST = map {$_->[0]} sort {$b->[3] cmp $a->[3]} map {[$_, split /,/]} @LIST;

1番目の要素で昇順で並べ替えし,さらに2番目の要素(数字)で降順で並べ替えを行う
@LIST = map {$_->[0]} sort {$a->[1] cmp $b->[1] or $b->[2] <=> $a->[2]} map {[$_, split /,/]} @LIST;


以上の記述は Schwartzian Transform という方式だそおうです。
一番最初のスクリプトはデータ要素2番目の数字で並べ替えをおこなっております。
sort関数では配列の中全てを並べ変えしてしまうので要素ごとに分解し特定の要素のみを並べ替えします

@LIST = sort {
my ($class, $number, $name) = split(/,/, $a);
my ($class, $number, $name) = split(/,/, $b);
$number <=> $number;
} @LIST;

上記の記述を効率的に行うのがSchwartzian Transformだそうです


<<










RSS


RingBlog v3.22