4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

配列オブジェクトにおけるsortメソッドまとめ

Last updated at Posted at 2018-09-11

##sortメソッドを学ぶにあたり、はじめに特殊な比較演算子 『<=>演算子』を復習しましょう!
###比較演算子(<=>)とは?

a <=> b

a が b より大きいなら正の整数
a と b が等しいなら 0
a が b より小さいなら負の整数
a と b が比較できない場合は nilを返す

##では、sortメソッドを学んで行きましょう!

numbers = [9, 4, 1, 5, 2, 3, 10, 6, 4, 8]
numbers.sort
=> [1, 2, 3, 4, 4, 5, 6, 8, 9, 10]

sortメソッドは新しい配列を返します。
要素の比較には、上で説明した比較演算子(<=>演算子)が用いられられて、
「a <=> b]を行い、a < bであれば、負の整数を返し、aが先に来る。a=bであれば、0を返し、同じ。a>bであれば、正の整数を返し、bが先となる。
このような処理の結果として、配列オブジェクトの要素は昇順に並び替えられます。

##少し発展した形も学んで見ましょう!

numbers = [2, 8, 7, 3, 6, 10, 1, 4, 5, 9]
numbers.sort {|a, b| b <=> a }
=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

sortメソッドにブロックを渡すと、<=>演算子の代わりにブロックの戻り値によって要素をソートします。ブロック引数a、 bには、比較する2要素が入ります。ブロックの戻り値が負の整数ならaが先、0なら同じ、正の整数ならbが先となります。このような結果として降順に並び替えられます。

##最後に
sortメソッドは、初学者にとって非常に理解しづらいと思いますが、基本を抑えれば、少しずつ使えるようになって行きます。積極的に使って行きましょう!

#追記
みなさんから指摘を受け、sort_byを学習したので、追記します

##sort_byとは?
sortと同じように比較演算子<=>を用いて、並び替えを行うメソッドになります。
sortより優れている点は、拡張性、複雑な処理を行う際の実行の速さがあります。
https://qiita.com/techno-tanoC/items/f64663eb9b6c0aa3dc37)

##sort_byの書き方

配列オブジェクトorハッシュオブジェクト.sort_by{|item| block }

流れとしては、
①配列オブジェクトorハッシュオブジェクトの要素を一つずつ変数(||)に代入する
②blockにて処理を行う
③ブロックの戻り値を並び替える(<=>が動いている)

###配列オブジェクトのケース

fruits = ["strawberry", "orange", "apple"]
p fruits.sort_by{|fru| fru.size}
=>["apple", "orange", "strawberry"]

要素を一つずる変数に代入し、変数を文字数で並び替えを行う。
###ハッシュオブジェクトのケース

fruits = {strawberry: 120, orange: 39, apple:60}
p fruits.sort_by{|k,v| v}
=>[[:orange, 39], [:apple, 60], [:strawberry, 120]]

変数を二つ指定している理由として、キー、バリューをどちらも代入するためである。比較対象にしたい方をブロックに代入し、その返り値に基づき、並び替えを行う。

4
2
4

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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?