3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】sortメソッドとUFO演算子(<=>)を完全にマスターしたい

Last updated at Posted at 2024-10-19

どうもこんにちは。

今回は、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演算子の結果に基づいて順序を決定します。以下のステップで動作します:

  1. 配列の要素を2つずつ選び、比較します
  2. 結果に基づく並び替え
    1. -1 が返された場合:左側の要素が右側より小さいため、左側を前にします
    2. 0 が返された場合:要素の順序は変更しません
    3. 1 が返された場合:左側の要素が右側より大きいため、左側を後ろにします
  3. 全体のソート

全てのペア比較が完了するまで、このプロセスを繰り返し、最終的に配列全体がソートされます。

自分のイメージだと、要素ごとにリーグ戦をやって並び替える感じですかね?

以下の例題を載せました。

例題

例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]

以上

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?