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

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

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

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

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

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


フリーランス案件を探すならこのエージェント!

運営会社 レバテック株式会社 株式会社Branding Engineer 株式会社Hajimari
対応エリア 東京・神奈川・埼玉・千葉
大阪・兵庫・京都・愛知・福岡
東京・神奈川・埼玉・千葉
大阪・兵庫・京都・奈良・和歌山・滋賀
東京・神奈川・埼玉・千葉
茨城・大阪・兵庫・福岡
案件数 約28,000件 約3,300件 約4,200件
平均単価 68.2万円 72.2万円
最高月収 145万円 200万円 176万円
特徴高単価な案件が多い
福利厚生サービスが受けられる
・首都圏の案件が中心
給与保証制度で安定した収入を得られる
・税務処理のサポートあり
・マージン率は実質20%
週2/週3の案件が多い
在宅/リモート案件が多い
・スタートアップ企業やベンチャー企業の案件が多い
紹介企業例 ・株式会社Gunosy
・株式会社バンダイナムコホールディングス
・株式会社ユーザベース
・Sansan株式会社
・株式会社一休
・株式会社FiNC Technologies など
・クックパッド株式会社
・株式会社カオナビ
・株式会社Kaizen Platform など
説明記事
公式サイト


転職を考えているならこのエージェント!

運営会社 レバテック株式会社 株式会社Branding Engineer 株式会社リブセンス
対応エリア 東京・神奈川・埼玉・千葉
大阪・兵庫・京都・愛知・福岡
東京・神奈川・埼玉・千葉
大阪・兵庫・京都・奈良・和歌山・滋賀
東京・神奈川・埼玉・千葉
茨城・大阪・兵庫・福岡
案件数 約13,000件 約800件
※非公開求人が多い

※ドラフト制のため、対象外
年齢層 20代:◎
30代:〇
40代:〇
20代:〇
30代:〇
40代:△
20代:〇
30代:〇
40代:〇
特徴エンジニア・デザイナーを専門としている
・カウンセリングに時間をかける
年収アップ率60%の実績
IT/Web/ゲーム業界専門の転職エージェント
・業界経験者がキャリアコンサルタントを務める
・丁寧なカウンセリングで入社後の離職率1%以下を実現
ドラフト制による採用を叶える特殊なサービス
スキル・経験重視で評価してもらえる
・他エンジニアの入札結果を見ることで
自分の市場価値が分かる
紹介企業例 ・サイボウズ株式会社
・株式会社サイバーエージェント
・Chatwork株式会社 など
・DMM.com
・Money Forward
・SmartHR など
・メルカリ
・ZOZOテクノロジーズ
・freee など
説明記事
公式サイト


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アプリケーションを開発する中で、配列は必ずと言ってよいほど使用することとなるオブジェクトになります。 […]

プログラミングイメージ

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

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