Search

検索したいワードを入力してください

Rubyで配列の要素を検索するための6個のメソッドまとめ

初回公開日:2019年01月28日

更新日:2019年02月19日

記載されている内容は2019年01月28日時点のものです。現在の情報と異なる可能性がありますので、ご了承ください。

また、記事に記載されている情報は自己責任でご活用いただき、本記事の内容に関する事項については、専門家等に相談するようにしてください。

配列の作り方を覚えても、その検索方法がわからなければ配列の使い道がありません。Rubyには配列を検索するメソッドがいくつかあります。そこでこの記事では、それぞれの特徴を解説しています。Rubyの配列の検索を理解したい方はまずこの記事をぜひご覧ください

配列の検索とは

プログラミング言語「Ruby」を使用して配列を作ると、その中から要素を検索する必要性が出てきます。

もちろん、配列の中身を表示して自分で確認することも可能ですが、要素の数が多かったり、特定の条件に基づく要素を取り出したい場合にメソッドを使った方が正確かつスピーディーに処理できます。

Rubyには検索のための便利なメソッドがいくつかありますので、これから解説していきます。

Rubyのその他の配列操作に関する記事はこちら
Rubyの配列の要素や配列自体を削除する方法
Rubyの配列の要素数を数える方法
Rubyの配列を結合する方法
Rubyの配列を並び替える(ソート)方法
Rubyの配列を初期化する方法
Rubyで配列要素を追加する方法

Rubyの配列の検索方法まとめ

どのような場面で配列の検索が必要になるでしょうか。例えば、配列の中に日本の都道府県が入っていたとします。

そこで、ローマ字表記が5文字の探さなくてはいけない場合、検索が便利になります。もちろん、中身を見ることで確認することはできますが、47都道府県全て確認するのは大変です。

また、各都道府県の配列を作っておき、その県庁所在地を調べる方法はないでしょうか。実はこれも配列の中に各都道府県とその県庁所在地のペアを作っておくことで容易に検索をかけることができます。

このように、配列の検索には(1)配列から要素を検索する場合と(2)配列から配列を検索する場合の大きく二つに分けることができます。実際に具体例を挙げて確認していきましょう。

配列から要素を検索する

まず、配列から要素を検索するためには、select/find_allメソッド、rejectメソッド、detect/findメソッドが使用できます。スペルを見ただけでは、違いがわかりにくいですが、それぞれ明確な違いがあります。

Rubyのselect/find_allメソッドは配列の中の要素にブロックが処理された結果、真だったものを配列として返します。

rejectメソッドでは、配列の要素にブロックを処理した結果、真だった要素が配列から取り除かれます。

detect/findメソッドは、配列の要素にブロックを処理した結果、真だった最初の要素を返します。

なお、配列のブロックとは、メソッド実行時に渡される処理のことで、今回のメソッドでは{}の中に囲まれている中身のことです。

他の2つのメソッドと異なり、rejectメソッドは真となるものを取り除くメソッドであることに注意しておいてください。

select/find_allメソッドを使って配列要素を検索する方法

Rubyのselect/find_allメソッドはそれぞれarray.select {|item| (処理する事柄)}、array.find_all {|item| (処理する事柄)}として使います。


members = ["Paul", "John", "George", "Ringo"]
p members.find_all {|member| member.length == 4 }
#→["Paul", "John"]
p members
#→["Paul", "John", "George", "Ringo"]
p members.select {|member| member.length == 4 }
#→["Paul", "John"]


配列membersの各要素memberに対して、文字が4つあるものを取り出して配列にしています。破壊的メソッドではなく、あくまで検索に使うものですので、処理後配列の中身は変わっていないことに注意してください。

rejectメソッドを使って配列要素を検索する方法

Rubyのrejectメソッドはarray.reject{ |item|(処理する事項)}です。


members = ["Paul", "John", "George", "Ringo", "Bandmate"]
p members.reject {|member| member.length > 6 }
#→["Paul", "John", "George", "Ringo"]
p members
#→["Paul", "John", "George", "Ringo", "Bandmate"]
p members.reject! {|member| member.length > 6 }
#→["Paul", "John", "George", "Ringo"]
p members
#→["Paul", "John", "George", "Ringo"]

破壊的メソッドとしてrejectに「!」を加えると配列membersが書き換えられることを覚えておいてください。

detect/findメソッドを使って配列要素を検索する方法

Rubyのdetect/findメソッドはそれぞれarray.detect{ |item| (処理する事項)}、array.find{ |item| (処理する事項)}で使うことができます。

members = ["Paul", "John", "George", "Ringo"]
p members.detect {|member| member.length == 4 }
#→"Paul"
p members
#→["Paul", "John", "George", "Ringo"]
p members.find {|member| member.length == 4 }
#→"Paul"

文字数が4のメンバーは"Paul"と"John"ですが、"Paul"のみ該当しています。このメソッドは配列ではなく、該当する最初の要素が返されるのが、他メソッドとの大きな違いです。

また、破壊的メソッドではないので、配列の中身は変わらないことを覚えておきましょう。

配列から配列を検索する方法

冒頭で触れましたが、例えば、都道府県を入力したらその都道府県庁所在地を取り出すという場合に、配列から配列を検索する方法があります。

配列ではなく、ハッシュクラスを使うことでキーと値を設定し、検索する方法もありますが、配列とハッシュはそれぞれ使えるメソッドも若干異なり、それぞれメリットデメリットがあるので、ここではまず配列を使うやり方を覚えましょう。

Rubyのassocメソッドを使うことで、配列から配列を検索することができます。都道府県とその県庁所在地を示す配列citiesを作り、実際のコードをこれからみていきましょう。

cities = [["Kanagawa","Yokohama"], ["Osaka", "Osaka"], ["Aichi", "Nagoya"], ["Hokkaido", "Sapporo"], ["Fukuoka", "Fukuoka"]]

assocメソッドを使う方法

Rubyのassocメソッドはarray.assoc(key)の形で使用されます。早速、上記で設定した配列citiesにメソッドを利用しましょう。

p cities.assoc('Aichi')
#→ ["Aichi", "Nagoya"]
p cities
#→ [["Kanagawa", "Yokohama"], ["Osaka", "Osaka"], ["Aichi", "Nagoya"], ["Hokkaido", "Sapporo"], ["Fukuoka", "Fukuoka"]]

今回、'Aichi'をkeyに入れたので、それに対応する配列["Aichi", "Nagoya"]が出力されています。'Aichi'に対応する要素の'Nagoya'が単独で出力されないことに注意してください。

破壊的メソッドではないので、配列は書き換えられません。

どのメソッドを使うべきか

ここまで、Rubyで配列の要素を検索するための4つの方法を紹介しました。しかし、findメソッドがあればfind_allメソッドもあり、少し紛らわしいです。ここでそれぞれの特徴をもう一度まとめておきましょう。

まず配列の検索には、要素を検索するselect/find_all、reject、detect/findメソッド、そして配列から配列を検索するassocメソッドがあります。

さらに、要素の検索時に真であるものを返すselect/find_all、detect/findメソッドと真であるものを取り除くrejectメソッドに分けることができます。そして、select/find_allメソッドは配列が返る一方でdetect/findメソッドは最初の要素が返されます。

各メソッドを試してみることで、より違いを実感することができると思うので、ご自身で配列を作ってコーディングしてみてください。

Rubyのその他の配列操作に関する記事はこちら
Rubyの配列の要素や配列自体を削除する方法
Rubyの配列の要素数を数える方法
Rubyの配列を結合する方法
Rubyの配列を並び替える(ソート)方法
Rubyの配列を初期化する方法
Rubyで配列要素を追加する方法

Related