Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 配列.sort / sort_by / reverse

配列.sort / sort_by / reverse

配列を並べ替えたり、反転させるメソッドです。『sort』は昇順ソート、『sort_by』はブロックの戻り値を基準にソート、『reverse』は要素の順序を逆にします。

構文
# 配列を昇順に並べ替えた新しい配列を返します。
配列.sort
配列.sort { |a, b| a <=> b }

# ブロックの戻り値を基準に並べ替えた新しい配列を返します。
配列.sort_by { |要素| 基準となる値 }

# 配列の要素の順序を逆にした新しい配列を返します。
配列.reverse
メソッド一覧
メソッド概要
sort配列を昇順に並べ替えた新しい配列を返します。ブロックを渡すと比較ロジックを自由に指定できます。
sort_by { |e| ... }ブロックの戻り値を比較キーとして並べ替えます。文字列長や属性値での並べ替えに便利です。
sort!元の配列を直接並べ替えます(破壊的メソッド)。
sort_by!元の配列をブロックの基準で直接並べ替えます(破壊的メソッド)。
reverse要素の順序を逆にした新しい配列を返します。
reverse!元の配列の順序を直接逆にします(破壊的メソッド)。
サンプルコード
# 数値の昇順ソート
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
puts numbers.sort.inspect       # [1, 1, 2, 3, 4, 5, 6, 9]

# 数値の降順ソート(ブロックで比較順を逆にします)
puts numbers.sort { |a, b| b <=> a }.inspect  # [9, 6, 5, 4, 3, 2, 1, 1]

# 文字列の並べ替え(辞書順)
words = ['banana', 'apple', 'cherry', 'date']
puts words.sort.inspect         # ["apple", "banana", "cherry", "date"]

# 文字列長を基準に並べ替え
puts words.sort_by { |w| w.length }.inspect   # ["date", "apple", "banana", "cherry"]

# ハッシュの配列を特定のキーで並べ替え
people = [
  { name: '太郎', age: 30 },
  { name: '花子', age: 25 },
  { name: '次郎', age: 28 }
]
sorted = people.sort_by { |p| p[:age] }
sorted.each { |p| puts "#{p[:name]}: #{p[:age]}歳" }
# 花子: 25歳、次郎: 28歳、太郎: 30歳 の順に出力されます。

# 配列の反転
puts [1, 2, 3, 4, 5].reverse.inspect   # [5, 4, 3, 2, 1]
puts 'hello'.chars.reverse.join        # olleh(文字列を逆順にするテクニック)

# 破壊的メソッド(元の配列を変更します)
arr = [5, 3, 1, 4, 2]
arr.sort!
puts arr.inspect   # [1, 2, 3, 4, 5](元の配列が変更されています)
概要

『sort』は要素同士を『<=>』(宇宙船演算子)で比較して並べ替えます。ブロックを渡すと、戻り値が『-1』『0』『1』のいずれかになるように比較ロジックを記述することで、降順や複合条件での並べ替えが可能です。

『sort_by』はブロックの戻り値を比較キーとして使うため、複雑なオブジェクトの並べ替えをシンプルに書けます。大量データのソートでは『sort_by』の方が『sort』よりも効率的です。これはブロックの呼び出し回数が少なくなるためです。

末尾に『!』が付くメソッドは元の配列を直接変更します。元のデータを保持したい場合は破壊的でないメソッドを使いましょう。複数のキーで並べ替えたい場合は、ブロック内で配列を返すテクニックが便利です(例:『sort_by { |e| [e[:age], e[:name]] }』)。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。