• ベストアンサー

複数キーによるソート

ここに、3つperlの配列があって、それぞれ問題番号、英単語、日本語訳が入っています。 これらを、例えば「英単語順」「問題番号順」などに並べ替えて先頭から順に取り出したいのですが、sort関数は配列ひとつに対してしか操作できないので、悩んでいます。 たとえば問題番号←→英単語の配列間に単語ごとのリンクを張って、片方をソートしてもリンクをたどるともう片方が取り出せるといったことはできるのでしょうか? また、配列のソートのルールを使って別の配列をソートする・・・といったことでも構いません。よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.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' を引数にすれば、番号順や訳順の添え字リストが返ります。 # ソースをコピーする場合は、全角スペースを半角スペースやタブに変換してください。

pythian
質問者

お礼

あっ、なるほど!そういう方法があったんですね。多次元配列や連想配列でだいぶ悩んでいました(ハッシュでも出来ますね、一応)。ありがとうございます、使わせて頂きます。

関連するQ&A