カタカナ3文字と漢字の名前がセットになったデータを、頭文字3文字のカタカナで50音順ソーティングしたいのですが、何故かうまくいきません。
原因と解決法をご教授いただければ幸です。
データは例えば、以下の様なものです。
(以下はプログラムでソーティングした結果ですが、以下のとおり微妙に50音順でソーティングされません)
イジュ 伊集院光
アキモ 秋元康
オグリ 小栗旬
スピッ スピッツ
エハラ 江原啓之
スマッ SMAP
ナカガ 中川翔子
ニュー NEWS
バクシ 爆笑問題
イノウ 井上陽水
ヤマダ 山田太一
----------------
私が試したソーティングプログラムは以下です。
----------------
$space = " ";
foreach $key (sort keys %yomi1) {
print $yomi1{$key}.$space.$title{$key}."<BR>";
;}
----------------
$yomi1{$key}には名前の頭文字カタカナ3文字が入っています。
$title{$key}には漢字の名前が入っています。
以上、よろしくお願い致します。
No.1
- 回答日時:
手元で確認した限り, 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です。
お手数かけますが、よろしくお願い致します。
No.2
- 回答日時:
ハッシュの要素でソートされていらっしゃるようですが
各要素「$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;
No.3
- 回答日時:
まずハッシュ(連想配列)の構造を理解しましょう
とりあえずサンプルです
## ハッシュを利用したいならこんな感じ
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>";
}
No.4ベストアンサー
- 回答日時:
何度もすいません
前のリストの配列によるサンプル出力の訂正
print $yomi.$space.$title."<BR>";
です。
あわててコピペしてしまいました。
すいません。
ralf124c様の大きなヒント(質問)を元に、ソーティングの直前にあるプログラムを下記のとおりに改造したら、うまくソーティングできました!
----------------
$id{$yomikata} = $id;
$title{$yomikata} = $title;
$yomikata{$yomikata} = $yomikata;
$yomi1{$yomikata}= substr($yomikata,0,6);
$usno++;
}
----------------
また、御丁寧にサンプルプログラムまで提示していただき、ありがとうございます。
今後は、提示していただいた、サンプルプログラムを元に、ハッシュ(連想配列)の構造とソーティングの理解を深めていきたいと思っています。
この度は、ご指導いただき、誠にありがとうございました。
心より感謝致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- マウス・キーボード PCで大文字と小文字が逆になりました。 3 2023/06/17 11:00
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- サッカー・フットサル 創世期日本サッカー(特にジュビロ?)を育てたイタリア人(?)背は高くなく体格も華奢だった人を教えて。 6 2023/03/16 10:05
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Ruby パイソンプログラミング 2 2022/12/03 18:44
- Visual Basic(VBA) VBA 「,」・空白・カタカナ等の複数条件のマクロ 2 2023/08/23 11:57
- その他(言語学・言語) 文字で片仮名にする意味ないとこで片仮名にする人いますがなぜですが? 例えば 「文字でカタカナにスル意 7 2023/04/15 09:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
ハッシュ検索はなぜ速い
-
*(アスタリスク)の意味
-
チェックデジットについて
-
ハッシュ値によるファイルの同...
-
python の素朴な疑問
-
ハッシュマーク以降のアドレス取得
-
プログラミングについて。 1つ...
-
どなたかこのプログラミングを...
-
ネットワークループとルーティ...
-
perlでファイルの拡張子を除い...
-
VBAでの一時停止と再開の方法
-
画面を強制的に再描画させる方法
-
二次元配列のインデックスについて
-
イベントの発生を待つ
-
UWSCの終了の仕方
-
Strawberry Perl for Windows ...
-
多重ループの抜けだし方
-
Perlで<select multiple>の複数...
-
【VBA】指定の範囲から特定の文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
まったく同じファイルのハッシ...
-
ハッシュ値が一致したデータは...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
データベースでユーザーのパス...
-
UTF-8で書かれたJSPの日本語文...
-
Perlは戻り値で、ハッシュや配...
-
perlで配列名を動的に作り出したい
-
ハッシュリストって単にハッシ...
-
短いハッシュの作り方
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
連想配列のサイズ制限
-
python の素朴な疑問
-
多次元配列から重複を削除
-
一意(ユニーク)かつ、ソート...
おすすめ情報