今回は、Ruby初心者の方々に向けて、配列内の要素を検索する際に知っておくと便利なメソッドをご紹介させていただきます。
Webアプリケーションを開発する中で、配列は必ず使用することとなるオブジェクトになります。
そのため、今回ご紹介するメソッドを知っているだけで、コードをかなり簡素化することができ、開発スピードもグンと向上すること間違いなしです。
なお、配列の便利なメソッドを用途別にもまとめてありますので、こちらもぜひ合わせてご覧になってくださいね。
>> 配列を初期化する方法
>> 配列に要素を追加する方法
>> 配列から要素を削除する方法
>> 配列のサイズを調べる方法
フリーランス案件を探すならこのエージェント!
転職を考えているならこのエージェント!
- 1 Rubyの配列とは
- 2 【Ruby】配列内の要素を検索する際に便利なメソッド一覧
- 2.1 【Ruby】配列内の要素を検索する際に便利なメソッドその1 include?メソッド
- 2.2 【Ruby】配列内の要素を検索する際に便利なメソッドその2 indexメソッド
- 2.3 【Ruby】配列内の要素を検索する際に便利なメソッドその3 selectメソッド
- 2.4 【Ruby】配列内の要素を検索する際に便利なメソッドその4 rejectメソッド
- 2.5 【Ruby】配列内の要素を検索する際に便利なメソッドその5 findメソッド
- 2.6 【Ruby】配列内の要素を検索する際に便利なメソッドその6 grepメソッド
- 2.7 【Ruby】配列内の要素を検索する際に便利なメソッドその7 take_whileメソッド
- 2.8 【Ruby】配列内の要素を検索する際に便利なメソッドその8 drop_whileメソッド
- 3 最後に
Rubyの配列とは
配列とは、任意のオブジェクトを複数まとめた上で、それらを同じように取り扱える/それらに対して同じ処理を加えられるようにしたオブジェクトです。
詳細については以下の記事にて詳しくご説明していますので、「まだ配列のイメージがイマイチ掴めていない…」という方はまずはこちらの記事からご覧くださいね。
今回は、Rubyの配列(Array)の基本的な使い方についてご紹介させていただきます。 Webアプリケーションを開発する中で、配列は必ずと言ってよいほど使用することとなるオブジェクトになります。 そのため、今回ご紹介する、基本[…]
【Ruby】配列内の要素を検索する際に便利なメソッド一覧
今回ご紹介しようと思っているメソッドは、以下の8種類になります。
- 1. include?
- 2. index
- 3. select
- 4. reject
- 5. find
- 6. grep
- 7. take_while
- 8. drop_while
それぞれの主な用途や使い方、そして具体例を交えながらご説明させていただきますね。
【Ruby】配列内の要素を検索する際に便利なメソッドその1 include?メソッド
まずご紹介するのは、「include?」メソッドです。
include?メソッドは、配列内に指定した要素が含まれているかどうかを検索する際に使用します。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP"]
irb(main):002:0> array.include?("Ruby")
=> true
irb(main):003:0> array.include?("HTML")
=> false
このように、引数に指定したオブジェクトが含まれているかを判定し、戻り値はBoolean値(true / false)になります。
【Ruby】配列内の要素を検索する際に便利なメソッドその2 indexメソッド
続いてご紹介するのは、「index」メソッドです。
indexメソッドを使うと、指定した要素が存在する場合にその要素の「添字」を返してくれます。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP"]
irb(main):002:0> array.index("Rails")
=> 1
irb(main):003:0> array.index("HTML")
=> nil
このように、該当する要素が存在する場合にはその添字を返し、該当する要素がない場合にはnil
を返します。
また、indexメソッドは以下のようにブロックをとることもできます。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.index do |name|
irb(main):003:1* name.size == 4
irb(main):004:0> end
=> 0
このように、文字数が4の要素を検索することも可能です。ただし、上記を見ていただいてもお分かりの通り、該当する要素が複数ある場合(ここでは”Ruby”と”Java”)であっても、最初に合致した要素のみを返します。
そのため、該当する全ての要素の添字を得たい場合は、以下のように対応する必要があります。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.filter_map.with_index do |name, idx|
irb(main):003:1* idx if name.size == 4
irb(main):004:0> end
=> [0, 5]
# Rubyのバージョンが2.7よりも小さい場合は以下の通りになります。
irb(main):001:1* array.map.with_index do |name, idx|
irb(main):002:1* idx if name.size == 4
irb(main):003:0> end.compact
=> [0, 5]
filter_mapメソッドはRuby2.7より実装された新たなメソッドであり、selectメソッドとmapメソッドを合わせた(条件に合致する要素で構成される配列を返す)機能を持ちます。
with_indexメソッドを重ねることで該当する要素の添字も扱うことができるようになり、idx if name.size == 4
という部分で、文字数が4の要素の添字を返しているということですね。
また、配列の後ろから検索することのできるrindexメソッドも存在しています。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.rindex do |name|
irb(main):003:1* name.size == 4
irb(main):004:0> end
=> 5
【Ruby】配列内の要素を検索する際に便利なメソッドその3 selectメソッド
続いてご紹介するのは、「select」メソッドです。
selectメソッドを使うと、設定した条件式に当てはまる要素のみ抽出した配列を作ることができます。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.select do |name|
irb(main):003:1* name.size == 4
irb(main):004:0> end
=> ["Ruby", "Java"]
【Ruby】配列内の要素を検索する際に便利なメソッドその4 rejectメソッド
続いてご紹介するのは、「reject」メソッドです。
続いては、「reject」メソッドをご紹介します。
rejectメソッドはselectメソッドと反対で、条件式に合わない要素を抽出した配列を作ることができます。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.reject do |name|
irb(main):003:1* name.size == 4
irb(main):004:0> end
=> ["Rails", "Javascript", "Go", "PHP"]
このように、「文字数が4ではない」要素を返して来ているのがお分かりいただけるかと思います。
select / reject を日本語に直すと、それぞれ”選択する” と “拒否する” になりますので、直感的に使い分けられますよね。
【Ruby】配列内の要素を検索する際に便利なメソッドその5 findメソッド
続いてご紹介するのは、「find」メソッドです。
findメソッドでは、ブロック内の条件式に該当する要素のうち、最初の要素を返します。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.find do |name|
irb(main):003:1* name.size == 4
irb(main):004:0> end
=> "Ruby"
irb(main):002:1* array.find do |name|
irb(main):003:1* name.size == 1
irb(main):004:0> end
=> nil
上記の通り、条件に合致する要素が見つからなかった場合にはnil
を返します。
なお、条件に合致した要素の添字を得たい場合には、find_indexメソッドというものも存在しています。
irb(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb(main):002:1* array.find_index do |name|
irb(main):003:1* name.size == 4
irb(main):004:0> end
=> 0
これは最初の方でご紹介したindexメソッドと同じ使い方ですね。
【Ruby】配列内の要素を検索する際に便利なメソッドその6 grepメソッド
続いてご紹介するのは、「grep」メソッドです。
grepメソッドを使うと、引数に設定した条件にマッチする要素を返してくれます。
irb#1(main):001:0> array = ["Ruby", "Rails", "Javascript", "Go", "PHP", "Java"]
irb#1(main):002:0> array.grep(/[r]/)
=> ["Javascript"]
irb#1(main):003:0> array.grep(/[R]/)
=> ["Ruby", "Rails"]
irb#1(main):004:0> array.grep(/[k]/)
=> []
grepメソッドの特徴としては、引数に正規表現が使えるということです(正規表現については説明することが多すぎるので、また別の機会にご説明させていただきますね)。
今回の例では、配列のうち、”r” を含むもの、”R” を含むもの、”k” を含むものを順に検索し、それぞれ期待通りの結果が帰ってきているのがお分かりいただけると思います。
マッチする要素がない場合には空の配列が返ってきますので、その点だけ注意が必要ですね。
【Ruby】配列内の要素を検索する際に便利なメソッドその7 take_whileメソッド
続いてご紹介するのは、「take_while」メソッドです。
take_whileメソッドは少し面白いメソッドで、ブロック内の条件式の結果がfalseになる一つ前の要素まで抽出してくれます。
具体例を見ながらその使い方を確認してきましょう。
irb(main):001:0> array = [1, 2, 3, 4, 5, 6, 7, 8]
irb(main):002:1* array.take_while do |number|
irb(main):003:1* number < 6
irb(main):004:0> end
=> [1, 2, 3, 4, 5]
上記のように、6よりも小さい数字だけを取り出してくれていますよね。
ここで、「あれ、似たようなメソッドなかったっけ?」と思われた方、さすがです。
そう、これは最初の方でご紹介したselectメソッドでも実現可能なのです。
irb(main):001:0> array = [1, 2, 3, 4, 5, 6, 7, 8]
irb(main):002:1* array.select do |number|
irb(main):003:1* number < 6
irb(main):004:0> end
=> [1, 2, 3, 4, 5]
では、両者にはどのような違いがあるのでしょうか?
それはズバリ「処理スピード」です。
selectメソッドの場合、全ての配列の要素を確認した上で条件に合致する要素を返す一方で、take_whileメソッドは条件に合致しない要素が現れた時点でそれ以降の処理をストップしてしまいます。
そのため、上記のような例ではそれほど処理速度の違いは出ませんが、さらに大きな数字まで検討するということになると、ある程度違いが歴然としてきます。
ただし、take_whileメソッドの性質上、条件に合致しない要素以降の処理はストップしてしまいますので、[1, 3, 4, 2, 9, 5]
のような順序が整えられていない配列から4より小さい数字を抽出しようとした場合には、selectメソッドを使用しないといけないのでご注意くださいね(※この場合にtake_whileメソッドを使用すると、[1, 3]
だけが返ってきてしまいます)。
【Ruby】配列内の要素を検索する際に便利なメソッドその8 drop_whileメソッド
最後にご紹介するのは、「drop_while」メソッドです。
drop_whileメソッドは、take_whileメソッドとは反対にブロック内の条件式の結果がfalseになった以降の要素全てを抽出してくれます。
irb(main):001:0> array = [1, 2, 3, 4, 5, 6, 7, 8]
irb(main):002:1* array.drop_while do |number|
irb(main):003:1* number < 6
irb(main):004:0> end
=> [6, 7, 8]
このdrop_whileメソッドも、take_whileメソッドがselectメソッドで互換できるのと同様に、rejectメソッドでも互換可能です。
また、注意点としても同じで、条件式の結果がfalseになった以降の要素を無条件で抽出しますので、順序が整えられていない配列に対してはrejectメソッドを使用するようにしましょう。
最後に
さて、ここまで、Rubyを使って配列内の要素を検索するためのメソッドをご紹介してきましたがいかがでしたか?
今回ご紹介したものを頭に入れておけば、普段の開発でも特段困ることはなくなるはずですので、どんどん積極的に使っていってくださいね。
なお、配列を扱う際に知っておくべきその他の便利なメソッドについては以下の記事にてご説明していますので、こちらもぜひご確認ください。
今回は、Ruby初心者の方々に向けて、配列(Array)を扱う際に最低限知っておくべきメソッドをご紹介させていただきます。 Webアプリケーションを開発する中で、配列は必ずと言ってよいほど使用することとなるオブジェクトになります。 […]
このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。
最後まで読んで頂きありがとうございました。