{"id":79874,"date":"2024-03-23T13:56:24","date_gmt":"2024-03-23T04:56:24","guid":{"rendered":"https://freelance.indieverse.co.jp/media/?p=79874"},"modified":"2025-11-01T16:34:53","modified_gmt":"2025-11-01T07:34:53","slug":"ruby-sort","status":"publish","type":"post","link":"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-sort","title":{"rendered":"Rubyのsortメソッドの使い方 | sort_byとの違いも解説"},"content":{"rendered":"<p>この記事では、</p>\n<ul></ul>\n<ul>\n<li>Rubyでの基本的なSortメソッドの使い方</li>\n<li>配列やオブジェクトを含む複雑なデータ構造のソート方法</li>\n<li>SortとSort_byメソッドを使い分けるコツ</li>\n</ul>\n<p>について現役Rubyエンジニアが解説していきたいと思います。</p>\n<p><strong>著者：河合大</strong></p>\n\n\t<div class='balloon5'>\n\t\t<div class='faceicon'>\n\t\t\t<img src='https://pbs.twimg.com/profile_images/1230103371664613376/PHLMWlPU_400x400.jpg'>\n\t\t\t<div style='text-align:center'>DAI</div>\n\t\t</div>\n\t\t<div class='chatting'>\n\t\t\t<div class='says'>\n<a href=\"https://www.worksap.co.jp/\">株式会社ワークスアプリケーションズ</a>にてQAエンジニア→<a href=\"https://aidemy.co.jp/\">株式会社Aidemy</a>にてAIプログラミングスクールのマーケティングを担当→キャリアコーチングサービスのパイオニアである<a href=\"https://www.posiwill.co.jp/\">ポジウィル株式会社</a>にCMO就任→<a href=\"https://indieverse.jp/\">株式会社インディバース</a>を創業。<br />\nIT系キャリアに関して情報発信している<a href=\"https://freelance.indieverse.co.jp/media/\">DAINOTE</a>を運営。自身も自社プロダクトである<a href=\"https://media-analytics.jp/\">Media Analytics</a>の開発をRuby on Railsで行うWebエンジニアである。本業はWebマーケター。最近は生成AI系の開発にどハマり中。著書は<a href=\"https://www.amazon.co.jp/%E7%8B%AC%E5%AD%A6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEAI%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E6%B2%B3%E5%90%88-%E5%A4%A7/dp/4046040076\">独学プログラマーのためのAIアプリ開発がわかる本 </a>。詳細は<a href=\"https://freelance.indieverse.co.jp/media/company\">運営者情報</a>をご覧ください。 <a href=\"https://twitter.com/never_be_a_pm\">@never_be_a_pm</a><br />\n</div>\n\t\t</div>\n\t</div>\n\t\n<h2>配列の基本的なsort</h2>\n<p>Rubyの配列をソートする場合、<code>sort</code>メソッドを使用します。</p>\n<p>このメソッドは、配列の要素を比較して、昇順に並び替えます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>numbers = [5, 3, 8, 6, 1]\r\nsorted_numbers = numbers.sort\r\nputs sorted_numbers</code></pre>\n</div>\n<p>実行結果:</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>[1, 3, 5, 6, 8]</code></pre>\n</div>\n<p>これが配列をソートする最も基本的な方法です。文字列も同様の方法でソートできます。</p>\n<h2>文字列のソート方法</h2>\n<p>文字列を含む配列をソートするには、同じく<code>sort</code>メソッドを利用します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>words = [\"banana\", \"apple\", \"cherry\"]\r\nsorted_words = words.sort\r\nputs sorted_words</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[\"apple\", \"banana\", \"cherry\"]</code></p>\n<p>文字列は辞書順にソートされます。</p>\n<h2>配列内のオブジェクトをソート</h2>\n<p>配列内にハッシュやオブジェクトが含まれる場合、<code>sort</code>メソッドをカスタマイズすることでソートできます。ブロックを使用して、特定の属性やキーに基づいてソートします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>people = [{name: \"John\", age: 45}, {name: \"Anna\", age: 32}, {name: \"Peter\", age: 28}]\r\nsorted_people = people.sort_by { |person| person[:age] }\r\nputs sorted_people</code></pre>\n</div>\n<p>実行結果:</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>[{:name=&gt;\"Peter\", :age=&gt;28}, {:name=&gt;\"Anna\", :age=&gt;32}, {:name=&gt;\"John\", :age=&gt;45}]</code></pre>\n</div>\n<p>この例では、人々を年齢で昇順にソートしています。</p>\n<p>関連：</p>\n<h3>複数の条件でのソート方法</h3>\n<p><code>sort_by</code>メソッドは、複数の条件でソートするのにも便利です。例えば、名前でソートし、同じ名前の場合は年齢でソートしたい場合は次のようにします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>people = [{name: \"John\", age: 45}, {name: \"Anna\", age: 32}, {name: \"John\", age: 28}]\r\nsorted_people = people.sort_by { |person| [person[:name], person[:age]] }\r\nputs sorted_people</code></pre>\n</div>\n<p>実行結果:</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>[{:name=&gt;\"Anna\", :age=&gt;32}, {:name=&gt;\"John\", :age=&gt;28}, {:name=&gt;\"John\", :age=&gt;45}]</code></pre>\n</div>\n<p>名前で最初にソートし、それから年齢でソートしています。</p>\n<h2>SortとSort_byメソッドの違い</h2>\n<p><code>sort</code>と<code>sort_by</code>メソッドの違いを理解することは、Rubyでのソート操作において重要です。基本的に、<code>sort</code>メソッドはシンプルな配列のソートに適していますが、<code>sort_by</code>メソッドはより複雑なデータ構造のソートや、複数の条件に基づくソートに適しています。</p>\n<p><code>sort</code>メソッドは、ブロックを利用して要素間の比較を行い、その結果に基づいて配列をソートします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>numbers = [5, 3, 8, 6, 1]\r\nsorted_numbers = numbers.sort { |a, b| a &lt;=&gt; b }\r\nputs sorted_numbers</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[1, 3, 5, 6, 8]</code></p>\n<p>一方、<code>sort_by</code>メソッドは、各要素から特定の属性や値を抽出し、それらを比較してソートする場合に適しています。例えば、オブジェクトの特定の属性に基づいてソートする場合などです。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>people = [{name: \"John\", age: 45}, {name: \"Anna\", age: 32}, {name: \"Peter\", age: 28}]\r\nsorted_people = people.sort_by { |person| person[:age] }\r\nputs sorted_people</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[{:name=&gt;\"Peter\", :age=&gt;28}, {:name=&gt;\"Anna\", :age=&gt;32}, {:name=&gt;\"John\", :age=&gt;45}]</code></p>\n<h2>Sortメソッドで降順に並び替える</h2>\n<h3>逆順ソートの基本</h3>\n<p><code>sort</code>メソッドを使って配列の要素を降順にソートするには、ブロック内の比較演算子の向きを変えるか、<code>sort</code>メソッド後に<code>reverse</code>メソッドをチェーンさせます。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>numbers = [5, 3, 8, 6, 1]\r\ndesc_sorted_numbers = numbers.sort.reverse\r\nputs desc_sorted_numbers</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[8, 6, 5, 3, 1]</code></p>\n<p>また</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>numbers = [5, 3, 8, 6, 1]\r\ndesc_sorted_numbers = numbers.sort { |a, b| b &lt;=&gt; a }\r\nputs desc_sorted_numbers</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[8, 6, 5, 3, 1]</code></p>\n<p>このようにして、降順にソートします。</p>\n<h2>Sort_byメソッドでハッシュをソート</h2>\n<p><code>sort_by</code>メソッドは、ハッシュやオブジェクトなどの構造化データをソートする際に非常に役立ちます。例えば、ハッシュのバリューに基づいてソートしたい場合は以下のようにします。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code># ハッシュをキーでソート\r\nh = { \"banana\" =&gt; 3, \"apple\" =&gt; 1, \"cherry\" =&gt; 2 }\r\nsorted_h = h.sort_by { |key, value| key }\r\nputs sorted_h</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[[\"apple\", 1], [\"banana\", 3], [\"cherry\", 2]]</code></p>\n<h2>ハッシュをバリューでソート</h2>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>h = { \"banana\" =&gt; 3, \"apple\" =&gt; 1, \"cherry\" =&gt; 2 }\r\nsorted_h = h.sort_by { |key, value| value }\r\nputs sorted_h</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[[\"apple\", 1], [\"cherry\", 2], [\"banana\", 3]]</code></p>\n<p>このように<code>sort_by</code>メソッドを利用することで、キーまたはバリューに基づくソートが容易になります。</p>\n<p>関連：<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-hash\">【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します</a></p>\n<a href=\"https://freelance.indieverse.co.jp/media/programming/ruby/ruby-hash\" target=\"_blank\" class=\"related-article-container\">\n\t\t\t\t\t<span class=\"related-article__label\">合わせて読みたい</span>\n\t\t\t\t\t<div class=\"related-article__image\" style=\"background-image:url(https://freelance.indieverse.co.jp/media/wp-content/uploads/2022/11/code-g7e399f5d0_1280-150x150.jpg)\"></div>\n\t\t\t\t\t<div class=\"related-article__content\">\n\t\t\t\t\t\t<div class=\"related-article__title\">【Ruby】 hashの使い方完全マニュアル | 追加, 更新, 削除, 高度な利用方法について現役エンジニアが解説します</div>\n\t\t\t\t\t\t<div class=\"related-article__description\">RubyのHashの使い方を基礎から応用まで解説。配列との違い、追加・更新・削除、key...</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n<h2>破壊的メソッドと非破壊的メソッドの使い分け:sortとsort!</h2>\n<p>Rubyでは、メソッド名に感嘆符<code>!</code>がつくメソッドは、その操作がオブジェクトを変更する「破壊的メソッド」であることを示します。<code>sort</code>メソッドにも破壊的なバージョンである<code>sort!</code>が存在し、このメソッドは元の配列自体をソートして変更します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>numbers = [5, 3, 8, 6, 1]\r\nnumbers.sort!\r\nputs numbers</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[1, 3, 5, 6, 8]</code></p>\n<p>非破壊的な<code>sort</code>メソッドの場合、ソートされた新しい配列が返されますが、元の配列は変更されません。これに対して、<code>sort!</code>メソッドは元の配列自体を変更します。</p>\n<h2>&lt;=&gt;演算子の役割と比較方法</h2>\n<p><code>sort</code>や<code>sort_by</code>メソッドでは、ブロックを使用することで、より複雑なソート処理を実装することが可能です。ブロック内で比較する要素を具体的に指定し、カスタマイズしたソート処理を実現できます。</p>\n<p><code>&lt;=&gt;</code>演算子（スペースシップ演算子）は、ソート処理において重要な役割を担います。この演算子は、左のオペランドが右のオペランドより小さい時に<code>-1</code>、等しい時に<code>0</code>、大きい時に<code>1</code>を返します。これにより、<code>sort</code>メソッドのブロック内で要素同士を比較し、ソート順を決定します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>words = [\"banana\", \"apple\", \"cherry\"]\r\nsorted_words = words.sort do |a, b|\r\na.length &lt;=&gt; b.length\r\nend\r\nputs sorted_words</code></pre>\n</div>\n<p>実行結果:</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>[\"apple\", \"banana\", \"cherry\"]</code></pre>\n</div>\n<p>このコードでは、文字列の長さを基準にソートしています。<code>&lt;=&gt;</code>演算子は、比較の結果に基づいて配列をソートする際に便利なツールです。</p>\n<h2>複雑な配列のソート方法</h2>\n<h3>一次元配列と二次元配列のソート方法</h3>\n<p>Rubyでは、単純な一次元配列だけでなく、二次元配列のソートも容易に行えます。二次元配列をソートする場合、<code>sort</code>または<code>sort_by</code>メソッドを使用し、ソートの基準となる要素をブロック内で指定します。</p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-ruby\" data-lang=\"Ruby\"><code>array = [[2, 3], [1, 4], [3, 1]]\r\nsorted_array = array.sort_by { |element| element[0] }\r\nputs sorted_array.inspect</code></pre>\n</div>\n<p>実行結果:</p>\n<p><code>[[1, 4], [2, 3], [3, 1]]</code></p>\n<p>この例では、二次元配列の各要素（配列）の最初の数を基準にしてソートしています。<code>sort_by</code>メソッドを活用することで、複雑なデータ構造を持つ配列でも柔軟にソート処理を行うことが可能です。</p>\n","protected":false},"excerpt":{"rendered":"<p>現役Rubyエンジニアがsortとsort_byの違いと使い分けを解説。配列・文字列・ハッシュの昇順/降順、複数条件やブロックでのソート手法を効率的に学べます。</p>\n","protected":false},"author":1,"featured_media":54391,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[190],"tags":[286],"class_list":["post-79874","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby","tag-ruby"],"aioseo_notices":[],"meta_description":"現役Rubyエンジニアがsortとsort_byの違いと使い分けを解説。配列・文字列・ハッシュの昇順/降順、複数条件やブロックでのソート手法を効率的に学べます。","_links":{"self":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts"}],"about":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/types/post"}],"author":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/users/1"}],"replies":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/comments?post=79874"}],"version-history":[{"count":8,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79874/revisions"}],"predecessor-version":[{"id":93452,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/posts/79874/revisions/93452"}],"wp:featuredmedia":[{"embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media/54391"}],"wp:attachment":[{"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/media?parent=79874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/categories?post=79874"},{"taxonomy":"post_tag","embeddable":true,"href":"https://freelance.indieverse.co.jp/media/wp-json/wp/v2/tags?post=79874"}],"curies":[{"name":"wp","href":"https://api.w.org/{rel}","templated":true}]}}