CGI-BBS > CGI > Perl > 表示データーをいろいろな条件でソートして表示したい


カレッヂ
カレッヂ


質問者 やまあらし  投稿日 5/5(日) 23:38:58
いつもここに頼ってばかりですが、何度やっても上手くいかないので教えて下さい
例えば
データーファイル Data.datの中にコンマ区切りで
番号,名前,生年,月,日,年齢の順で

1,田中,1972,5,25,40 
2,山田,1995,6,23,15
3,木村,1935,12,31,80

($a,$b,$c,$d,$e,$f)とした
と言ったデーターがあり
CGIで読み込み、分割し、変数に代入して一覧表示させるまではできます。

そこに番号順とか年齢順とかでソートして表示したいのですが
ソート関数をどのように使えばいいのか分かりません。

年齢順にソートしたい場合、年齢の変数$fをどうにかすればいいのかと
考えたのですが
単純に sort関数で処理できるのでしょうか

また処理をするのはどの時点で処理すればスムーズなのでしょうか
おわかりの方いらっしゃいましたら教えて下さい。
よろしくお願いします。
回答者 しあわせのツボ  [削除]  投稿日 5/6(月) 00:18:52
see log:
http://www.rescue.ne.jp/CGI-BBS/cgi/perl/20020314010255.shtml
回答者 Cal  [削除]  投稿日 2005/5/29(日) 22:17:37
しあわせのツボさんの示されたスレを見て思ったのですが、
あそこで皆さんが示されているソースは、正しくは
「2次元配列化するためにセパレータを仕込んだ、1次元配列のソート」
だと思いますが、そういう認識でよいでしょうか。

もし私の誤認でなければ、わかる方にとっては大差ない差分ですが、
わからない方にとっては、それなりにハードルが高いサンプルなんだと思います。

foreach $lineStr(@oneDim) {
	@fields =split(/,/, $lineStr);
	push(@twoDim, [@fields]);
}

として正しく2次元化した配列に対しては、

for($i =0; $i <= ($#twoDim); $i++) {push(@tmp, $twoDim[$i][2])}
@twoDim =@twoDim[sort {$tmp[$a] cmp $tmp[$b]} 0..$#tmp];

といった形で、ソートのキーとなる値を与えてやる必要があります。
ネストして多次元に対応させることもできますが、3次元以上の場合は
おそらくQuickSortアルゴリズムで自作した方が扱い易く
実行速度も速くなると思います。

sort {(split(/,/,$a))[2] cmp (split(/,/,$b))[2]} @twoDim;
と
@tmp =map {(split /,/)[2]} @twoDim;
@twoDim =@twoDim[sort {$tmp[$a] cmp $tmp[$b]} 0..$#tmp]; 
は、
配列の要素がカンマ区切りテキストの場合のソートですね。

返信(回答)する


Web裏技