- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列のソートについて質問です。)
配列のソートについての質問
このQ&Aのポイント
- 配列のソートについて質問です。2つのキーで配列の中身をソートしたいのですが、スマートな書き方があれば教えてください。
- 要素を2つのキーでソートする方法について質問です。具体的には、@dataという配列をソートしたいです。
- @dataという配列を2つのキーでソートしたい場合、スマートな書き方があれば教えてください。
- みんなの回答 (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という本で紹介されているようです。 「シュワルツ変換」あるいは「シュウォーツ変換」で検索すれば、詳しい説明がヒットすると思います。
その他の回答 (1)
- _--_1l1_1_
- ベストアンサー率67% (102/152)
回答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;
質問者
お礼
変な書き方をしていないと分かって安心できました。 書き方例もありがとうございました!
お礼
調べ方も分からないという状態だったので、 教えて頂いたキーワードが参考になりそうです。 説明ありがとうございました!