ume

Rubyメソッド sort_byメソッドとsliceメソッド

前書き

文字列に含まれる数字の小さい順に並び替える処理を実装するのに時間がかかったので記事に残します.
変更前

["mario12","wario1","yosii165","peach2"]

↓このように数字の小さい順番に並び替えたい

["wario1","peach2","mario12","yosii165"]

結論

sort_byメソッドとsliceメソッドを使う

["mario12","wario1","yosii165","peach2"].sort_by{|element| element.slice(/\d+/).to_i }
#出力結果["wario1","peach2","mario12","yosii165"]

解説

  1. sort_by{}メソッドで配列から要素を1つずつブロック内の引数に代入する
["mario12","wario1","yosii165","peach2"].sort_by{|element|  }

"mario12"から順番にelementに代入される。

  1. sort_byメソッドのブロック内にどういう条件で並び替えるのか条件を指定する。
{|element| "mario12".slice(/\d+/).to_i }

"mario12".sliceメソッド(正規表現)で今回は文字列内の数値を取得しています。つまり12を取得して数値の小さい順に並び替えるという指定になっています。\dは数値を表し、+は直前のものを(\d)を1回以上繰り返すという意味。

sort_byの引数にブロック( {} )を渡すことでブロック内の条件で小さい順に並び替えます。.

※sortとsort_byは同じメソッドだがsort_byの方を使う方がいい(理由は知りませんが処理が早いそうです)

sliceメソッドの使い方

www.sejuku.net

まとめ

  • 配列.sort_by{条件}で配列を小さい順に並び替える。ブロック内の条件の出力値でというふうに覚えると処理が理解しやすい