どうもこんにちは。
今回は、sort
メソッドとUFO演算子(<=>
)について完璧に理解しようと思ったので、備忘録として残しておきます。
使用例
ary = [2, 4, 8, 1, 16]
puts ary.sort #=> [1, 2, 4, 8, 16]
puts ary.sort{ |i,j| i <=> j } #=> [1, 2, 4, 8, 16]
puts ary.sort{ |i,j| -i <=> -j } #=> [16, 8, 4, 2, 1]
ary2 = [-1, 8, -7, 2, -14]
puts ary2.sort { |i,j| i.abs <=> j.abs } #=> [-1, 2, -7, 8, -14]
sort
メソッドはそのまま使用すれば、要素を昇順に並び替えてくれます。
また、ブロックを使用して条件を与えて要素を並び替えることもできます。
(単純な昇順だけでなく、絶対値の昇順/降順などに並び替えることもできます。)
UFO演算子 (<=>
) の役割
UFO演算子 (<=>
) は、2つのオブジェクトを比較し、以下の3つの値のいずれかを返します:
戻り値 | ケース |
---|---|
-1 | 左側のオブジェクトが右側より小さい場合 |
0 | 左側のオブジェクトと右側のオブジェクトが等しい場合 |
1 | 左側のオブジェクトが右側より大きい場合 |
これらの値を基に、sort
メソッドは配列の要素を並び替えます。
sort メソッドの動作原理
sort
メソッドは、配列の要素同士をペアで比較し、UFO演算子の結果に基づいて順序を決定します。以下のステップで動作します:
- 配列の要素を2つずつ選び、比較します
- 結果に基づく並び替え
- -1 が返された場合:左側の要素が右側より小さいため、左側を前にします
- 0 が返された場合:要素の順序は変更しません
- 1 が返された場合:左側の要素が右側より大きいため、左側を後ろにします
- 全体のソート
全てのペア比較が完了するまで、このプロセスを繰り返し、最終的に配列全体がソートされます。
自分のイメージだと、要素ごとにリーグ戦をやって並び替える感じですかね?
以下の例題を載せました。
例題
例1
ary1 = [6,2]
puts ary1.sort{ |i,j| i <=> j } # 6<=>2を実行すると`1`が返ってくるため、順番を2,6とする。
#=> [2,6]
例2
ary2 = [6,2,3]
puts ary2.sort{ |i,j| i <=> j }
# 6<=>2を実行すると`1`が返ってくるため、順番を2,6,3とする。
# 6<=>3を実行すると`1`が返ってくるため、順番を2,3,6とする。
# 2<=>3を実行すると`-1`が返ってくるため、順番を2,3,6とする。
#=> [2,3,6]
例3
ary3 = [6,2,3,1]
puts ary3.sort{ |i,j| i <=> j }
# 6<=>2を実行すると`1`が返ってくるため、順番を2,6,3,1とする。
# 6<=>3を実行すると`1`が返ってくるため、順番を2,3,6,1とする。
# 6<=>1を実行すると`1`が返ってくるため、順番を2,3,1,6とする。
# 2<=>3を実行すると`-1`が返ってくるため、順番を2,3,1,6とする。
# 3<=>1を実行すると`1`が返ってくるため、順番を2,1,3,6とする。
# 2<=>1を実行すると`1`が返ってくるため、順番を1,2,3,6とする。
#=> [1,2,3,6]
以上