Rubyで配列とハッシュをソートする方法(例が含まれています)
Rubyで配列を並べ替えるのは簡単です!
派手なアルゴリズムを書く必要はありません 希望する結果を得るには。
では、何が必要ですか?
Rubyの組み込みの並べ替え方法を理解する。
これら :
- 並べ替え
- sort_by
- 並べ替え!
これらの方法はどのように機能し、なぜ異なるのですか?
それがこの記事でわかることです。
sort
から始めて、配列を並べ替えるさまざまな方法を学びます。 メソッド、次にsort_by
を見てください 高度な並べ替え(複数の値による)など。
やってみましょう!
並べ替えと並べ替えの使い方を学ぶ! Rubyメソッド
ソートの最も基本的な形式は、Enumerableモジュールによって定義されるRubyソートメソッドによって提供されます。
例を見てみましょう :
numbers = [5,3,2,1] numbers.sort # [1,2,3,5]
sort
に注意してください 結果を含む新しい配列を返します。
並べ替えられた要素の配列!
sort!
を使用して「インプレース」で並べ替えることもできます。 メソッド。
これは、元の配列が変更されることを意味します 新しいものを作成する代わりに、パフォーマンスに良い場合があります。
sort_byによるカスタマイズされた並べ替え
sort_by
を使用 より高度で興味深い並べ替えを実行できる方法。
できるようになります :
- 文字列の長さで並べ替え
- 文字列の内容で並べ替え
- 数値が偶数か奇数かで並べ替える
これは、sort_by
を使用して行うことができます メソッドとRubyブロック。
例 :
strings = %w(foo test blog a) strings.sort_by(&:length) # ["a", "foo", "test", "blog"]
これはどのように機能しますか?
さて、sort_by
メソッドは数値を想定しているため、length
動作します。
これを理解していれば、この方法を使用して、大文字で始まる単語を並べ替えたり、他のすべてをそのままにしておくなど、クールなことを行うことができます。
このように :
def sort_by_capital_word(text) text .split .sort_by { |w| w[0].match?(/[A-Z]/) ? 0 : 1 } .join(" ") end sort_by_capital_word("calendar Cat tap Lamp") # "Cat Lamp calendar tap"
通常のsort
を使用してカスタムソートを行うことも可能です ブロックを使用したメソッド。
ここに例があります :
strings = %w(foo test blog a) strings.sort { |a,b| a.length <=> b.length } # ["a", "foo", "test", "blog"]
注 :この
<=>
シンボルは「宇宙船オペレーター」と呼ばれ、クラスに実装できるメソッドです。 1(より大きい)、0(等しい)、または-1(より小さい)を返す必要があります。
一般的に、私はsort_by
を好みます 意図がより明確で、読みやすく、少し速いためです。
逆順で並べ替え
逆に並べ替えるのはどうですか?
reverse
を使用できます 並べ替え後にメソッドを使用するか、ブロックを使用して、並べ替える対象の前にマイナス記号を付けることができます。
例を示しましょう :
strings = %w(foo test blog a) strings.sort_by { |str| -str.length } # ["blog", "test", "foo", "a"]
派手ではありませんが、機能します! 🙂
英数字の並べ替え
数字を含む文字列のリストを数値で並べ替えたいとします。
このように :
music = %w(21.mp3 10.mp3 5.mp3 40.mp3)
デフォルトでは、このリストは希望どおりに並べ替えられません。
例 :
music.sort # ["10.mp3", "21.mp3", "40.mp3", "5.mp3"]
ただし、sort_by
を使用してこれを修正できます :
music.sort_by { |s| s.scan(/\d+/).first.to_i } # ["5.mp3", "10.mp3", "21.mp3", "40.mp3"]
正規表現を使用しました(\d+
)番号を一致させてから、最初の番号を取得します(first
)&整数オブジェクトに変換します(to_i
。
Rubyでハッシュを並べ替える方法
配列の並べ替えだけでなく、ハッシュの並べ替えもできます。
例 :
hash = {coconut: 200, orange: 50, bacon: 100} hash.sort_by(&:last) # [[:orange, 50], [:bacon, 100], [:coconut, 200]]
これは値でソートされますが、ここで興味深いことに注意してください。返されるのはハッシュではありません。
ハッシュを並べ替えると、多次元配列が得られます。
これをハッシュに戻すには、Array#to_hメソッドを使用できます。
複数の値による並べ替え
複数の属性で何かを並べ替えることができます。つまり、最初に日付で並べ替えますが(たとえば)、同じ日付の物が複数あるため、同点になります。
結びつきを断ち切るには、二次属性を使用できます。
例 :
Event = Struct.new(:name, :date) events = [] events << Event.new("book sale", Time.now) events << Event.new("course sale", Time.now) events << Event.new("new subscriber", Time.now) events << Event.new("course sale", Time.now + 1.day) events.sort_by { |event| [event.date, event.name] }
ここで重要なのは、sort_by
内の配列です。 ブロック。
配列の最初の要素としてプライマリソート属性を設定する場所(event.date
)&次にセカンダリタイブレーカー属性(event.name
。
QuickSortの実装
楽しみのために、独自の並べ替え方法を実装しましょう。これは、組み込みの並べ替え方法よりも遅くなりますが、コンピュータサイエンスが好きな場合は、それでも興味深い演習です。
def quick_sort(list) return [] if list.empty? groups = list.group_by { |n| n <=> list.first } less_than = groups[-1] || [] first = groups[0] || [] greater_than = groups[1] || [] quick_sort(less_than) + first + quick_sort(greater_than) end p quick_sort [3, 7, 2, 1, 8, 12] # [1, 2, 3, 7, 8, 12]
クイックソートの考え方は、ランダムに1つの数値を選択してから、並べ替えるリストを2つのグループに分割することです。
1つのグループは選択された数よりも小さい数であり、もう1つのグループは選択された数よりも大きい数です。
次に、リストが並べ替えられるまでこの操作を繰り返します。
ベンチマーク
これらすべての並べ替え方法をパフォーマンスの観点から比較してみましょう。
ルビー2.4.0 :
sort!: 1405.8 i/s sort: 1377.6 i/s - same-ish: difference falls within error sort_by reverse: 196.6 i/s - 7.15x slower sort_by: 183.7 i/s - 7.65x slower sort_by minus: 172.3 i/s - 8.16x slower sort with block: 164.1 i/s - 8.57x slower
ご覧のとおり、通常のsort
メソッドはsort_by
よりもはるかに高速です 、ただし、ブロックを使用しない限り、柔軟性はありません。
ビデオ
概要
sort
の使い方を学びました &sort_by
配列とハッシュをさまざまな方法で並べ替えるメソッド。また、パフォーマンスの違いとクイックソートアルゴリズムの実装方法についても学びました。
覚えておくべきことは次のとおりです :
-
sort
を使用できます 配列、ハッシュ、または別のEnumerableオブジェクトのメソッドを使用すると、デフォルトの並べ替え動作が得られます(<=>
に基づいて並べ替えます 演算子) -
sort
を使用できます ブロックと2つのブロック引数を使用して、あるオブジェクトが別のオブジェクトとどのように異なるかを定義します(ブロックは1、0、または-1を返す必要があります) -
sort_by
を使用できます ブロックと1つの引数を使用して、並べ替えの基礎として使用されるオブジェクトごとに1つの属性(配列の長さ、オブジェクトの属性、インデックスなど)を定義します。ブロックは、並べ替えられた配列内のオブジェクトの位置を決定する整数値を返す必要があります。
この投稿を共有することを忘れないでください より多くの人が学ぶことができます。 🙂
-
Rubyでファイルを読み書きする方法(例付き)
今日は、Rubyでファイルを読み書きして、コンテンツを抽出し、新しいファイルを作成し、必要な情報を見つける方法を学びます。 これから説明します : コンテンツ 1Rubyでファイルを読み取る方法 2Rubyでファイルに書き込む方法 3つのRubyファイルメソッド 4つのディレクトリ操作 5FileUtilsモジュールの使用方法 6まとめ 6.1関連 やってみましょう! Rubyでファイルを読み取る方法 次のようにRubyでファイルを読み取ることができます: ファイルを開く 、open メソッド。 ファイルを読む 、ファイル全体、行ごと、または特定のバイト数。 ファイルを
-
Rubyの配列クラスの使用方法(例+便利なメソッド)
アレイとは何ですか? 配列は組み込みのRubyクラスであり、0個以上のアイテムのリストを保持します 、およびこれらすべてのアイテムを簡単に追加、アクセス、およびループするのに役立つメソッドが含まれています。 配列が存在しない場合は多くの変数を使用する必要があるため、これは便利です。 例 : a =1b =2c =3 しかし、代わりに、あなたはそうすることができます : 番号=[1、2、3] 最良の部分は? 配列内には何でも入れることができます! いいね : 数字 文字列 より多くのアレイ! (それは多次元配列になります) アレイを最大限に活用できるように、アレイについ