前書き
- 配列のソートで新しいソートを見つけたので、忘却録として記事に残します。
やりたいこと
⇨条件分岐を利用して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は条件分岐を使うと複数条件でソートすることができる.