【Ruby】配列内の要素を検索するメソッドをまとめてご紹介!

  • 2020年4月8日
  • 2021年10月15日
  • Ruby

今回は、Ruby初心者の方々に向けて、配列内の要素を検索する際に知っておくと便利なメソッドをご紹介させていただきます。

Webアプリケーションを開発する中で、配列は必ず使用することとなるオブジェクトになります。

そのため、今回ご紹介するメソッドを知っているだけで、コードをかなり簡素化することができ、開発スピードもグンと向上すること間違いなしです。

なお、配列の便利なメソッドを用途別にもまとめてありますので、こちらもぜひ合わせてご覧になってくださいね。

>> 配列を初期化する方法
>> 配列に要素を追加する方法
>> 配列から要素を削除する方法
>> 配列のサイズを調べる方法


レバテックフリーランス … 業界最大級の案件数業界トップクラスの高単価報酬を誇る最大手のサービスです。実績豊富なコーディネーターが丁寧な対応をしてくれるため、案件の無理な提案はありません。フリーランスで生きていくためにはまず登録しておきましょう。
MidWorks … フリーランス賠償責任保障生命保険の折半など、フリーランスでありながらも正社員並みの保障を受けられるのが特徴です。また、経験豊富なキャリアコンサルタントによる手厚いサポートも受けられるため、安定したフリーランス生活を送りたい方には特におすすめのサービスです。
ポテパンフリーランス … IT業界・技術に詳しいコンサルタントが担当してくれるため、こちらの要望をきちんと理解した上で案件を紹介してくれます。また、案件情報のみならず、フリーランスのイロハについても教えてくれるため、フリーランスとして初めて活動される方には特におすすめのサービスです。

レバテックキャリア … ITエンジニアが利用したい転職エージェントNo.1にも選ばれており、年収600万円以上のハイクラス求人を5,000件以上も保有しています。エンジニアが転職を考えた時にまず初めに登録しておくべきサービスです。
Tech Stars Agent … Tech Stars Agentでは、担当エージェントが全員エンジニア出身のため、スキルやキャリアを見据えたきめ細かな転職支援が受けられます。運営元の株式会社Branding Engineerは、独立支援サービス「MidWorks」も展開しているため、独立を視野に入れたサポートも受けられます
転職ドラフト … 年収UP率93.8%/平均年収UP額126万円と圧倒的な年収UP率を誇るイベント型のエンジニア向け 転職サービスです。毎月1回開催され、厳選された優良IT/Web系企業約150社からダイレクトスカウトを受け取ることができます。年収アップを目指す方は登録必須です。

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メソッドを使用するようにしましょう

お仕事の途中ですが、少し一休みして、転職独立について考えてみませんか🙌?

現役エンジニアが選ぶおすすめの転職エージェント11選【成功談・失敗談もあります】

レバテックフリーランスの評判ってどう?【現役エンジニアが徹底解説します】

MidWorks(ミッドワークス)の評判ってどう?【現役エンジニアが徹底解説します】

日々の業務に追われて自分を見失わないよう、
定期的にキャリアを振り返るようにしておきましょう🤲

最後に

さて、ここまで、Rubyを使って配列内の要素を検索するためのメソッドをご紹介してきましたがいかがでしたか?

今回ご紹介したものを頭に入れておけば、普段の開発でも特段困ることはなくなるはずですので、どんどん積極的に使っていってくださいね。

なお、配列を扱う際に知っておくべきその他の便利なメソッドについては以下の記事にてご説明していますので、こちらもぜひご確認ください。

おすすめ記事

今回は、Ruby初心者の方々に向けて、配列(Array)を扱う際に最低限知っておくべきメソッドをご紹介させていただきます。 Webアプリケーションを開発する中で、配列は必ずと言ってよいほど使用することとなるオブジェクトになります。 […]

プログラミングイメージ

このブログを通じて少しでも「傍(はた)を楽(らく)にする」ことができていれば嬉しく思います。

最後まで読んで頂きありがとうございました。