1. ホーム
  2. arrays

ブロックが渡されたときのArray#sortの動作はどうなっていますか?

2023-07-25 14:42:22

質問

私は、どのように array.sort{ |x,y| block } が正確にどのように機能するのか、したがって、どのようにそれを使用するのでしょうか?

の例です。 Rubyのドキュメント :

   a = [ "d", "a", "e", "c", "b" ]
   a.sort                     #=> ["a", "b", "c", "d", "e"]
   a.sort { |x,y| y <=> x }   #=> ["e", "d", "c", "b", "a"]

どのように解決するのですか?

あなたの例では

a.sort

a.sort { |x, y| x <=> y }

ご存知のように、配列をソートするためには、その要素を比較する必要があります(もし疑うのであれば、比較を使用せずに任意のソートアルゴリズムを実装してみてください、いいえ < , > , <= または >= ).

あなたが提供するブロックは、実際には sort アルゴリズムによって呼び出される関数です。 つまり xy によって選ばれた入力配列の要素になります。 sort アルゴリズムによって選ばれた入力配列の要素です。

sort アルゴリズムは、この比較関数/ブロックがメソッドの要件を満たすと仮定します。 <=> :

  • x < y の場合は -1 を返す。
  • x = y ならば 0 を返す
  • x > yなら1を返す

適切な比較関数やブロックを用意しないと、配列の順序が不定になります。

これで、なぜ

a.sort { |x, y| x <=> y }

a.sort { |x, y| y <=> x }

は同じ配列を逆の順序で返します。


Tate Johnsonが追加した内容を詳しく説明すると、比較関数を実装すると <=> を実装すると、次のようになります。

  1. モジュールをインクルードすることができます。 Comparable をインクルードすると、以下のメソッドが自動的に定義されます。 between? , == , >= , < , <=> .
  2. クラスのインスタンスは、デフォルト(つまり引数なし)の sort .

なお <=> メソッドは、ruby の標準ライブラリで意味のあるものであればどこでもすでに提供されていることに注意してください ( Bignum , Array , File::Stat , Fixnum , String , Time など...)。