- ベストアンサー
複数キーによるソート
ここに、3つperlの配列があって、それぞれ問題番号、英単語、日本語訳が入っています。 これらを、例えば「英単語順」「問題番号順」などに並べ替えて先頭から順に取り出したいのですが、sort関数は配列ひとつに対してしか操作できないので、悩んでいます。 たとえば問題番号←→英単語の配列間に単語ごとのリンクを張って、片方をソートしてもリンクをたどるともう片方が取り出せるといったことはできるのでしょうか? また、配列のソートのルールを使って別の配列をソートする・・・といったことでも構いません。よろしくお願い致します。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> 3つperlの配列があって、それぞれ問題番号、英単語、日本語訳が というのは、例えばこんな感じでしょうか? my @code = (1 .. 5); my @word = qw(apple orange lemon grape banana); my @yaku = qw(りんご みかん レモン ぶどう バナナ); だとすれば、次のようなスクリプトでご希望のソートができます。 my %comp = ( code => sub { $code[ $a ] <=> $code[ $b ] } , word => sub { $word[ $a ] cmp $word[ $b ] } , yaku => sub { $yaku[ $a ] cmp $yaku[ $b ] } ); sub order { sort { $comp{ $_[0] }->() } (0 .. $#code); } my @order = order('word'); # 単語順のオーダ foreach (@order) { print "$code[$_]:$word[$_]:$yaku[$_]\n"; } exit; それぞれの配列を並べ替えるのではなく、希望の項目順にソートされた添え字のリスト(@order)を作り、これを使って表示を行っています。 関数orderを呼び出すときに、'code' や 'yaku' を引数にすれば、番号順や訳順の添え字リストが返ります。 # ソースをコピーする場合は、全角スペースを半角スペースやタブに変換してください。
お礼
あっ、なるほど!そういう方法があったんですね。多次元配列や連想配列でだいぶ悩んでいました(ハッシュでも出来ますね、一応)。ありがとうございます、使わせて頂きます。