• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列のソートについて質問です。)

配列のソートについての質問

このQ&Aのポイント
  • 配列のソートについて質問です。2つのキーで配列の中身をソートしたいのですが、スマートな書き方があれば教えてください。
  • 要素を2つのキーでソートする方法について質問です。具体的には、@dataという配列をソートしたいです。
  • @dataという配列を2つのキーでソートしたい場合、スマートな書き方があれば教えてください。

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

やっていることは同じなのですが、この場合、map、sort、mapの順で書き連ねていくシュワルツ(シュウォーツ)変換(Schwartzian Transform)という手法が有名です。 my @data = ( 'A,1,2', 'B,1,3', 'C,2,1', 'D,3,2', 'E,3,1', 'F,1,1' ); my @sorted_data = map $_->[0], sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] } map [ $_, (split /,/)[1,2] ], @data; Effective Perlという本で紹介されているようです。 「シュワルツ変換」あるいは「シュウォーツ変換」で検索すれば、詳しい説明がヒットすると思います。

ehtylb
質問者

お礼

調べ方も分からないという状態だったので、 教えて頂いたキーワードが参考になりそうです。 説明ありがとうございました!

その他の回答 (1)

回答No.1

書いてみましたが、今のままでもよいと思います。 my @data = ( 'A,1,2', 'B,1,3', 'C,2,1', 'D,3,2', 'E,3,1', 'F,1,1' ); my %key_of = map { $_ => [ ( split q{,}, $_ )[ 1, 2 ] ] } @data; my @sorted = sort { ( $key_of{$a}->[0] <=> $key_of{$b}->[0] ) or ( $key_of{$a}->[1] <=> $key_of{$b}->[1] ) } keys %key_of;

ehtylb
質問者

お礼

変な書き方をしていないと分かって安心できました。 書き方例もありがとうございました!

関連するQ&A

専門家に質問してみよう