記載されている内容は2019年04月10日時点のものです。現在の情報と異なる可能性がありますので、ご了承ください。記事に記載されている情報は自己責任でご活用いただき、本記事の内容に関する事項については、専門家等に相談するようにしてください。本記事では、配列やハッシュをソートするsortメソッドについて紹介します。これらは昇順にソートするメソッドですが、reverseメソッドやブロック式を利用すると、降順にソートすることもできます。こちらについても紹介します。シェアツイートはてブ目次RubyのsortメソッドとはRubyのsortの使い方ハッシュをキーでソートするハッシュを値でソートする適切なソート方法を選ぼうRubyのsortメソッドとはRubyにおけるsortメソッドでは、配列など、データの集まりをある順序で並び替えることができます。メソッドがあるので、ソートアルゴリズムを自分で実装する必要はありません。数値の場合は小さい順に、文字列の場合は、辞書順に並び替えられます。Rubyのsortの使い方Rubyにおけるsortメソッドの構文は、オブジェクト.sort{|変数|比較式}です。変数は隣接する2つの要素を表します。ブロックは指定しなくても使うことができます。配列をソートする方法sortメソッドは、ブロックがない場合は、数値の場合は大きさの昇順、文字列の場合は辞書順にソートされます。以下のRubyスクリプトでは、整数配列numsを大きさの昇順に、文字列配列wordsを辞書順にソートしています。"Peach"]降順の場合はreverseを使うRubyの配列(Array)には、順番を逆転するreverseメソッドがあります。よって、sortメソッドで、昇順にソートした後で、reverseメソッドを使うと、降順にソートした結果が得られます。数値の場合、sort_byブロック内で符号を反転してからソートを行うという方法でも、降順にソートすることができます。文字列についてはこのメソッドは使えません。数値配列を降順にソートするには、2つの方法がありますが、速度に違いはあるのでしょうか?以下のRubyスクリプトで検証してみます。3.6倍reverseメソッドを使う方が約3.6倍高速になりました。sort_byブロック内で、配列の要素を変換するのに時間がかかっているためと考えられます。ハッシュをキーでソートするハッシュについても、sort/sort_byメソッドが提供されています。ハッシュには順番(インデックス)がないので、ソートした結果は、キーと値の組の配列として返されます。昇順ソートの方法RubyのHashクラスにおいては、sortメソッドで何も引数を指定しない場合は、ハッシュのキーについてソートされます。105]]降順ソートの方法キーの降順にソートする方法については、まずソートした後、reverseで反転させるという方法が考えられます。98]]その他に、sortブロック内で比較演算子を使ってもソートを行うことができます。ブロック内に2つ変数を指定します。これらは隣接する左右の要素を表します。添字の0はキー、1は値を表しますので、第1変数を右辺、第2変数を左辺におくことでキーの降順にソートすることができます。98]]ソート速度の比較ハッシュの降順ソートについて、reverseを使う方法と、sortブロック内で指定する方法とのソート速度の比較を行います。以下のRubyスクリプトでは、ソートをそれぞれ100万回行って時間を計測しています。3.326(s)結果はsortメソッドでブロックを使うほうがやや高速になりました。ソート結果は、キーと値の組からなる配列であり、逆転させるのに時間がかかるためと考えられます。ハッシュを値でソートするハッシュは値についてもソートすることができます。これには、sortメソッドとsort_byメソッドを使う方法があります。sortメソッドを使う場合、ブロックを用いてsort{|a,b|a[1]<=>b[1]}とします。次に、sort_byメソッドを使う場合、ブロック内で変数を2つ指定すると、キーと値を表します。よって、sort_by{|k,v|v}とすれば、値についてソートされます。以下のRubyスクリプトでは、sort/sort_byメソッドを使って、ハッシュの値についてソートしています。128]]ソート速度の比較これら2つの方法について、速度の比較を行います。時間計測には、前と同じmeasure_timeメソッドを使用しています。2.583(s)結果は、sort_byメソッドを使う方がやや高速となりました。sort_byでは要素数の分ブロックが実行されますが、sortメソッドでは、要素の比較のたびにブロックが実行されるためと考えられます。降順ソートの方法これには3つの方法があります、sortメソッドを使う場合、ブロックを用いてsort{|a,b|b[1]<=>a[1]}とします。sort_byメソッドでは、sort_by{|k,v|-v}で符号を反転、もしくは、sort_by{|k,v|v}.reverseでソート結果を逆転させることで降順ソートできます。88]]ソート速度の比較これら3つの方法について、速度の比較を行います。時間計測には、前と同じmeasure_timeメソッドを使用します。2.918(s)結果は、sort_byメソッドで符号反転する方法が最速となりました。reverseメソッドではソート結果の配列の逆転に時間がかかり、sortメソッドではブロックで要素を比較する回数が多くなるためと考えられます。適切なソート方法を選ぼうRubyにおけるソートにはsortメソッドとsort_byメソッドがあり、ブロックを使用する方法もあります。これらの違いを表にまとめると、以下のようになります。降順ソートの場合は、sortした後にreverseする、sortブロック内で符号反転させる、もしくはsort_byブロック内で符号を反転させるという方法があります。このように、ソートする方法には複数の方法があるものもあり、速度の違いがあります。ソートの種類によって、最適な方法を選択しましょう。file.2:営業マンとして活躍し、海外留学。file.4:独学よりもスクールで。他人と同じことはしない。