- ベストアンサー
カタカナの50音順ソーティング
カタカナ3文字と漢字の名前がセットになったデータを、頭文字3文字のカタカナで50音順ソーティングしたいのですが、何故かうまくいきません。 原因と解決法をご教授いただければ幸です。 データは例えば、以下の様なものです。 (以下はプログラムでソーティングした結果ですが、以下のとおり微妙に50音順でソーティングされません) イジュ 伊集院光 アキモ 秋元康 オグリ 小栗旬 スピッ スピッツ エハラ 江原啓之 スマッ SMAP ナカガ 中川翔子 ニュー NEWS バクシ 爆笑問題 イノウ 井上陽水 ヤマダ 山田太一 ---------------- 私が試したソーティングプログラムは以下です。 ---------------- $space = " "; foreach $key (sort keys %yomi1) { print $yomi1{$key}.$space.$title{$key}."<BR>"; ;} ---------------- $yomi1{$key}には名前の頭文字カタカナ3文字が入っています。 $title{$key}には漢字の名前が入っています。 以上、よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
何度もすいません 前のリストの配列によるサンプル出力の訂正 print $yomi.$space.$title."<BR>"; です。 あわててコピペしてしまいました。 すいません。
その他の回答 (3)
- ralf124c
- ベストアンサー率52% (232/446)
まずハッシュ(連想配列)の構造を理解しましょう とりあえずサンプルです ## ハッシュを利用したいならこんな感じ my $space = ' '; my %title = ('イジュ'=>'伊集院光', 'アキモ'=>'秋元康', 'オグリ'=>'小栗旬', 'スピッ'=>'スピッツ', 'エハラ'=>'江原啓之', 'スマッ'=>'SMAP', 'ナカガ'=>'中川翔子', 'ニュー'=>'NEWS', 'バクシ'=>'爆笑問題', 'イノウ'=>'井上陽水', 'ヤマダ'=>'山田太一' ); foreach $yomi (sort keys %title){ print $yomi.$space.$title{$yomi}."<BR>"; } ## どうしても配列ならこんな感じ my $space = ' '; my @aDATA = ( 'イジュ 伊集院光', 'アキモ 秋元康', 'オグリ 小栗旬', 'スピッ スピッツ', 'エハラ 江原啓之', 'スマッ SMAP', 'ナカガ 中川翔子', 'ニュー NEWS', 'バクシ 爆笑問題', 'イノウ 井上陽水', 'ヤマダ 山田太一' ); my @aSORTED = sort @aDATA; foreach(0..$#aSORTED){ my ($yomi,$title) = split(/ /,$aSORTED[$_]); print $yomi.$space.$title{$yomi}."<BR>"; }
- ralf124c
- ベストアンサー率52% (232/446)
ハッシュの要素でソートされていらっしゃるようですが 各要素「$key」には何が入っていますか?
お礼
ralf124c様へ ご質問、ありがとうございます。 >ハッシュの要素でソートされていらっしゃるようですが >各要素「$key」には何が入っていますか? $keyを表示させる為に、プログラムを以下の様に改造しました。 ---------------- foreach $key (sort keys %yomi1) { print $yomi1{$key}.$space.$title{$key}."●KEYは".$key."<BR>"; ;} ---------------- そして、表示させたところ、以下の様に表示されました。 イジュ 伊集院光●KEYは0 アキモ 秋元康●KEYは1 オグリ 小栗旬●KEYは10 オダギ オダギリジョー●KEYは11 カトゥ KAT-TUN●KEYは12 キムラ 木村カエラ●KEYは13 ケツメ ケツメイシ●KEYは14 コイケ 小池徹平●KEYは15 コウダ 倖田來未●KEYは16 コジマ 小島よしお●KEYは17 コブク コブクロ●KEYは18 スピッ スピッツ●KEYは19 エハラ 江原啓之●KEYは2 スマッ SMAP●KEYは20 タチバ 立花隆●KEYは21 タマキ 玉木宏●KEYは22 ナカガ 中川翔子●KEYは23 ニュー NEWS●KEYは24 バクシ 爆笑問題●KEYは25 ハマサ 浜崎あゆみ●KEYは26 バンプ BUMP OF CHICKEN●KEYは27 ---------------- ということは、$keyの値でソーティングされてしまっている、ということでしょうか? ちなみに、このプログラムの直前で、下記の様なプログラムで、ハッシュ化しています。(以下、ソーティングプログラムを含め、全プログラムを記載します) ---------------- $usno=0; open(IN,"$file") || &error("Open Error : $file"); while (<IN>) { chomp; ($ptype,$num,$nam,$eml,$url,$id,$date,$host,$title,$yomikata) = split(/<>/); $id{$usno} = $id; $title{$usno} = $title; $yomikata{$usno} = $yomikata; $yomi1{$usno}= substr($yomikata,0,6); $usno++; } close(IN); $space = " "; # ソート処理 foreach $key (sort keys %yomi1) { print $yomi1{$key}.$space.$title{$key}."●KEYは".$key."<BR>"; ;} print "</body></html>\n"; exit;
- Tacosan
- ベストアンサー率23% (3656/15482)
手元で確認した限り, perl-5.8.8+EUC, ActivePerl-5.8.6+Shift_JIS のどちらの環境でもなりませんでした. 使われている文字コードとか perl のバージョンはどうなってますか?
お礼
Tacosan様 お返事、ありがとうございます。 >手元で確認した限り, perl-5.8.8+EUC, ActivePerl-5.8.6+Shift_JIS のどちらの環境でもなりませんでした. それは、私と同様に50音順にソーティングされなかった、という意味でしょうか? それとも、上記の様に変なソーティングはされなかった(=きちんと50音順にソーティングされた)、という意味でしょうか? 教えて下さい。 >使われている文字コードとか perl のバージョンはどうなってますか? 使っている文字コードは、シフトJIS 改行コードはCR+LF です。 perl のバージョンは、サクラサーバーを使っているので、 5.8.xです。 お手数かけますが、よろしくお願い致します。
お礼
ralf124c様の大きなヒント(質問)を元に、ソーティングの直前にあるプログラムを下記のとおりに改造したら、うまくソーティングできました! ---------------- $id{$yomikata} = $id; $title{$yomikata} = $title; $yomikata{$yomikata} = $yomikata; $yomi1{$yomikata}= substr($yomikata,0,6); $usno++; } ---------------- また、御丁寧にサンプルプログラムまで提示していただき、ありがとうございます。 今後は、提示していただいた、サンプルプログラムを元に、ハッシュ(連想配列)の構造とソーティングの理解を深めていきたいと思っています。 この度は、ご指導いただき、誠にありがとうございました。 心より感謝致します。