本文へスキップ
BecomeCoder

Rubyコース · 第9章 実務のRuby ― 記法を深める · レッスン39

<=> とオブジェクトの並べ替え ― 大小を1つの物差しで

ブラウザで完結

導入

<=>(宇宙船演算子)は、2つの値を比べて「小さい・等しい・大きい」を -1 / 0 / 1 で返す演算子です。並べ替え(ソート)の心臓部で、これが分かると自分の好きな順番で並べられるようになります。

説明

<=> は比較結果を数値で返します。

puts (5 <=> 2)     # 1  (左が大きい)
puts (2 <=> 5)     # -1 (左が小さい)
puts (3 <=> 3)     # 0  (等しい)

sort はこの <=> を使って並べ替えます。ブロックで比較のしかたを指定すると、順番を自由に変えられます。

p [3, 1, 2].sort                      # [1, 2, 3](昇順)
p [3, 1, 2].sort { |a, b| b <=> a }   # [3, 2, 1](降順:a と b を逆に比べる)

sort_by は「何を基準に並べるか」をブロックで返すだけで済み、読みやすくよく使われます。

p ["bb", "a", "ccc"].sort_by { |s| s.length }   # ["a", "bb", "ccc"](長さ順)

users = [{ name: "太郎", age: 30 }, { name: "花子", age: 20 }]
p users.sort_by { |u| u[:age] }.map { |u| u[:name] }  # ["花子", "太郎"](年齢順)

やってみよう

sort のブロックで昇順・降順を切り替えたり、sort_by の基準(長さ・年齢・絶対値など)をいろいろ変えて並び順の変化を確かめましょう。

演習

[5, 2, 8, 1]sort_by大きい順に並べ替え、p で表示してください([8, 5, 2, 1] になります)。

ヒント1を見る

sort_by { |n| -n } のように符号を反転させると降順になります。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。