ume

誕生日データで学ぶ!Rubyのsort_byによるカスタムソートの実践例

前書き

  • 配列のソートで新しいソートを見つけたので、忘却録として記事に残します。

やりたいこと

⇨条件分岐を利用して1つの配列を2つの条件で並び替える.
[誕生月,日にち]の要素の配列birth_datesをある基準でソートする

birth_dates = [
  [4, 3],
  [3, 30],
  [3, 31],
  [4, 1],
  [12,31],
  [1,5],
  [10,23],
  [4, 2]
]

↓誕生日を4月2日以降で並び替える

birth_dates = [
  [4, 2],
  [4, 3],
  [10, 23],
  [12, 31],
  [1, 5],
  [3, 30],
  [3, 31],
  [4, 1],
]

どうやってソートしたか

birth_dates = [
  [4, 2],
  [4, 3],
  [10, 23],
  [12, 31],
  [1, 5],
  [3, 30],
  [3, 31],
  [4, 1],
]


standard_dates = {month:4,date:2}

 sorted_array =   birth_dates.sort_by do |month,date|
#5月以降か4月2日以降(4月2日含む)の場合とそれ以外(1月、2月、3月、4月1日)で分ける
     if (month > standard_dates[:month]) || (month == standard_dates[:month] && date >= standard_dates[:date])
        [0,month,date]
    else 
        [1,month,date]
    end     
end 
p sorted_array #出力結果[[4, 2], [4, 3], [10, 23], [12, 31], [1, 5], [3, 30], [3, 31], [4, 1]]
sort_by解説.
公式
配列.sort_by{|要素|並び替える条件}

例. 小さい数字順に並び替え
numbers = [5, 2, 8, 1, 4]
sorted = numbers.sort_by { |num| num }
p sorted
# => [1, 2, 4, 5, 8]

注意:並び替える条件はデフォルトでは昇順になる。降順にしたい場合-をつける.

解説.

①[0,month,date]や[1,month,date]このように0や1をつける理由は後から[[4月2日以降],[4月1日以前]]のように並び替えるため.
②[0,month,date]と[1,month,date]は下記のように4月2日以降(0がつく)と以前(1がつく)で配列の条件を分ける.

[[0, 4, 2], [0, 4, 3], [0, 10, 23], [0, 12, 31], [1, 1, 5], [1, 3, 30], [1, 3, 31], [1, 4, 1]]

③sort_byの返り値は上記の並び替えの基準で並び替えた、元々の配列(birth_dates)を返す。 なので下記のように返す.

birth_dates = [
  [4, 2],
  [4, 3],
  [10, 23],
  [12, 31],
  [1, 5],
  [3, 30],
  [3, 31],
  [4, 1],
]

まとめ

  • sort_byは条件分岐を使うと複数条件でソートすることができる.