カレッヂ |
質問者 やまあらし
投稿日 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裏技 |