Rubyリファレンス: Home

sort, sort! (Array)

Edit   History

標準クラス・モジュール > Array > sort, sort!

array.sort

sortメソッドは、配列の要素をソートした新しい配列を返します。要素の順序の比較には<=>演算子が使われ、「要素1 <=> 要素2」の結果が-1なら要素1が先、0なら同じ、1なら要素2が先となります。

<=>で比較できない要素が混じっていると例外ArgumentErrorが、要素の中に<=>を実装していないオブジェクトがあると例外NoMethodErrorが発生します。

numbers = [7, 2, 4, 9, 10, 1, 5, 8, 6, 3]
p numbers.sort
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
array.sort {|a, b| block }

sortメソッドにブロックを渡すと、<=>演算子の代わりにブロックの戻り値によって要素をソートします。ブロック引数abには、比較する2要素が入ります。ブロックの戻り値が-1ならaが先、0なら同じ、1ならbが先となります。

次の例は、要素を逆順にソートします。

numbers = [2, 8, 7, 3, 6, 10, 1, 4, 5, 9]
p numbers.sort {|a, b| b <=> a }
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
array.sort!

sort!メソッドは、配列の要素をソートします。レシーバ自身を変更するメソッドです。戻り値はレシーバ自身です。sortメソッドと同様に順序の比較には<=>演算子が使われます。

numbers = [2, 6, 5, 4, 9, 8, 10, 3, 7, 1]
numbers.sort!
p numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
array.sort! {|a, b| block }

sort!メソッドにブロックを渡すと、sortメソッドと同様にブロックの戻り値によって要素をソートします。

次の例は、文字列を大文字小文字の区別なく比較し、順序が同じ場合は<=>で比較してソートします。

words = ["happily", "Happy", "happines", "Happily"]
words.sort! do |a, b|
  ret = a.casecmp(b)
  ret == 0 ? a <=> b : ret
end
p words
["Happily", "happily", "happines", "Happy"]

関連項目