配列.sort / sort_by / reverse
| 対応: | Ruby 1.8(2003) |
|---|
配列を並べ替えたり、反転させるメソッドです。『sort』は昇順ソート、『sort_by』はブロックの戻り値を基準にソート、『reverse』は要素の順序を逆にします。
構文
# 配列を昇順に並べ替えた新しい配列を返します。
配列.sort
配列.sort { |a, b| a <=> b }
# ブロックの戻り値を基準に並べ替えた新しい配列を返します。
配列.sort_by { |要素| 基準となる値 }
# 配列の要素の順序を逆にした新しい配列を返します。
配列.reverse
メソッド一覧
| メソッド | 概要 |
|---|---|
| sort | 配列を昇順に並べ替えた新しい配列を返します。ブロックを渡すと比較ロジックを自由に指定できます。 |
| sort_by { |e| ... } | ブロックの戻り値を比較キーとして並べ替えます。文字列長や属性値での並べ替えに便利です。 |
| sort! | 元の配列を直接並べ替えます(破壊的メソッド)。 |
| sort_by! | 元の配列をブロックの基準で直接並べ替えます(破壊的メソッド)。 |
| reverse | 要素の順序を逆にした新しい配列を返します。 |
| reverse! | 元の配列の順序を直接逆にします(破壊的メソッド)。 |
サンプルコード
sample_array_sort_sort_by_reverse.rb
# 数値の昇順ソート
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]
# 文字列の並べ替え(辞書順)
names = ['Majima', 'Kiryu', 'Akiyama', 'Saejima']
puts names.sort.inspect # ["Akiyama", "Kiryu", "Majima", "Saejima"]
# 文字列長を基準に並べ替え
puts names.sort_by { |w| w.length }.inspect # ["Kiryu", "Majima", "Saejima", "Akiyama"]
# ハッシュの配列を特定のキーで並べ替え
people = [
{ name: '岡部倫太郎', age: 18, org: '未来ガジェット研究所' },
{ name: '椎名まゆり', age: 16, org: '未来ガジェット研究所' },
{ name: '牧瀬紅莉栖', age: 18, org: '未来ガジェット研究所' }
]
sorted = people.sort_by { |p| p[:age] }
sorted.each { |p| puts "#{p[:name]}: #{p[:age]}歳" }
# 椎名まゆり: 16歳、岡部倫太郎: 18歳、牧瀬紅莉栖: 18歳 の順に出力されます。
# 配列の反転
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](元の配列が変更されています)
ruby array_sort_sort_by_reverse.rb [1, 1, 2, 3, 4, 5, 6, 9] [9, 6, 5, 4, 3, 2, 1, 1] ["Akiyama", "Kiryu", "Majima", "Saejima"] ["Kiryu", "Majima", "Saejima", "Akiyama"] 椎名まゆり: 16歳 岡部倫太郎: 18歳 牧瀬紅莉栖: 18歳 [5, 4, 3, 2, 1] olleh [1, 2, 3, 4, 5]
概要
『sort』は要素同士を『<=>』(宇宙船演算子)で比較して並べ替えます。ブロックを渡すと、戻り値が『-1』『0』『1』のいずれかになるように比較ロジックを記述することで、降順や複合条件での並べ替えが可能です。
『sort_by』はブロックの戻り値を比較キーとして使うため、複雑なオブジェクトの並べ替えをシンプルに書けます。大量データのソートでは『sort_by』の方が『sort』よりも効率的です。これはブロックの呼び出し回数が少なくなるためです。
末尾に『!』が付くメソッドは元の配列を直接変更します。元のデータを保持したい場合は破壊的でないメソッドを使いましょう。複数のキーで並べ替えたい場合は、ブロック内で配列を返すテクニックが便利です(例:『sort_by { |e| [e[:age], e[:name]] }』)。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。