配列などで、特定の条件に一致した要素を取得する処理が必要なことがあります。
- 配列で条件に一致した要素を取得したい
- 正規表現で一致した要素を取得したい
- 複数条件を指定して要素を取得したい
そのような方に向けて、この記事では条件に一致した要素を取得できるselectメソッドについて、以下の内容を解説していきます!
【基礎】selectの使い方
【基礎】selectをindexで使う
【基礎】selectで使える条件
【発展】selectとinclude?を組み合わせる
【発展】selectで正規表現を使用する
【発展】selectを複数条件で使う
【発展】selectをhashで使う
【発展】selectの逆のreject
【発展】始めの要素だけ抜き出すfind(detect)
【発展】find_all(selectと同じメソッド)
【発展】selectとmapの違い
selectメソッドの基礎から応用までわかりやすく解説していますので、selectメソッドをぜひマスターしましょう!
selectメソッドとは
selectメソッドは条件式に一致した要素を取得するためのメソッドです。
書き方:
配列オブジェクト.select { |変数| ブロック処理 }
「{}」で囲ったブロックの変数に要素を一つずつ格納しながら、ブロックの処理が真になったときの要素を取得していきます。
一致した要素は新しい配列として返されます。
selectメソッドは用途によってさまざまな使い方が可能です。
次項よりselectメソッドの使い方について詳しく解説していきます。
基本的なselectの使い方
selectの使い方
それでは基本的なselectメソッドの使い方について見ていきましょう。
selectメソッドは、先述したように条件にマッチした要素を返した配列を作るメソッドです。
実際にコードで見ていきましょう。
array = [1,2,3,4,5] p array.select { |num| num > 3 } p array.select { |num| num == 3 } p array.select { |num| num <= 3 }
[実行結果]
[4, 5] [3] [1, 2, 3]
このように、1番目では3以上、2番目は3と完全に一致したもの、3番目は3以下という条件を満たしたものを返しています。
また、戻り値は配列として返されます。
このように、selectメソッドを使えば条件を指定して、配列から条件で絞った新しい配列を作成できます。
破壊的なselect!メソッド
select!メソッドは、selectメソッドを破壊的メソッドにしたものです。
先ほどのselectメソッドではレシーバー(元の配列)は変更されませんでしたが、select!メソッドは元の配列に変更を加えます。
array = [1,2,3,4,5] array.select! {|num| num > 3} p array
[実行結果]
[4,5]
このように、元の配列は[1,2,3,4,5]でしたが、select!メソッドで返った結果に変更されています。
selectでインデックスも扱う
selectメソッドにindex(添字)を同時に使うこともできます。
each_with_indexメソッドを使用することでブロックに配列のインデックスも同時に渡すことができます。
array = [8,33,43,56,77] p array.each_with_index.select {|num,index| index > 2}
[実行結果]
[[56, 3], [77, 4]]
numには配列の要素、indexには配列のインデックスが渡されています。
そして、そのindexの値をselectの条件として使用することで、条件を満たした要素とインデックスの値が多次元の配列として返されます。
応用的なselectの使い方
selectとinclude?を組み合わせる
まずはinclude?をselectの条件として使用してみましょう。
include?は配列に指定の要素が含まれているかどうかを判定するためのメソッドです。
array = ["right","light","erect","elect"] p array.select{|a| a.include?("ect")} p array.select{|a| a.include?("ght")}
[実行結果]
["erect", "elect"] ["right", "light"]
このようにinclude?を使うと、その文字列を含んでいるかどうかで新しい配列を作成できます。
今回は”ect”を含むもの、”ght”を含むものという条件でselectを使用してみました。
selectで正規表現を使用する
「=~」という演算子を使うと正規表現で条件を指定することができます。
array = ["right","light","erect","elect"] p array.select{|a| a =~ /Ar/}
[実行結果]
["right"]
今回は「A」という先頭の要素を意味する正規表現を使って、先頭がrで始まる文字列に絞り込んでみました。
なので、今回の配列の中で唯一先頭が「r」で始まる、「right」だけが配列として返されました。
指定する条件は自由ですので、ぜひここであげた例以外の条件指定を自分で考えてみてください。
また、正規表現は初心者を苦しめるトピックの一つですので、もしも理解が浅いと感じた方はこちらの記事を一読することをおすすめします。
selectを複数条件で使う
次にselectを複数条件で使う方法について見ていきます。
select内では、RubyのAND演算子やOR演算子をそのまま使うことができます。
array = 1..30 p array.select{|num| num % 2 == 0 && num % 3 ==0} p array.select{|num| num % 2 == 0 || num % 3 ==0}
[実行結果]
[6, 12, 18, 24, 30] [2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 26, 27, 28, 30]
このように30までの数字で、
・2の倍数かつ3の倍数(6の倍数)
・2の倍数か、3の倍数
という条件を指定してみました。
ANDはどちらの条件も満たす必要があり、ORはどちらの条件でもいいので、ANDの条件で絞った場合のほうが大抵は要素の少ない配列を返します。
条件を扱う際にはANDとORをよく使うので、いざというとき使えるようにしておきましょう。
ANDとORを使った条件指定の例はif文の解説でもしていますので、ぜひ一読してみてください。
selectをhashで使う
次にselectをhashで使う方法について見ていきます。
hashで使う際には、ブロック内に二つ引数を渡します。
その引数にそれぞれkeyとvalueが入ります。
hash = { key1: "ruby", key2: "python", key3: "java"} p hash.select{ |key, value| value == "ruby" }
[実行結果]
{:key1=>"ruby"}
このように、hashでも配列と同じように、マッチした要素を抽出できていることがわかります。
selectの逆のreject
selectの条件を反転させたrejectというメソッドも使用可能です。
指定した条件以外のもので配列を作成します。
array = [1,2,3,4,5] p array.reject{|num| num > 3}
[実行結果]
[1, 2, 3]
このように、3よりも大きな数字という条件に一致しないものが出力されます。
始めの要素だけ抜き出すfind(detect)
selectでは条件に一致するすべての要素を出力しましたが、findメソッドは条件に一致した始めの要素を一つだけを返します。
サンプルコードで確認してみましょう。
array = [1,2,3,4,5] p array.find{|num| num > 2}
[実行結果]
3
このように、findは先頭の要素だけを返します。
find_all(selectと同じメソッド)
rubyにはselectメソッドの他に、find_allメソッドもあります。
こちらは、selectメソッドと全く同じメソッドです。
同じであるということをサンプルコードで確認してみましょう。
array = [1,2,3,4,5] p array.find_all{|num | num > 2}
[実行結果]
[3,4,5]
このように、2以上である配列の要素を返しています。
これまで、この記事を読んできた方であれば、selectメソッドと同じであるということがわかるはずです。
selectとmapの違い
selectは単に条件によって、要素の絞り込みを行うだけですが、mapは要素に変更を加えて新たな配列を返します。
array = [1,2,3,4,5] p array.select{|num| num > 3} p array.map{|num| num*3 if num > 3} p array.map{|num| num*3 if num > 3}.compact
[実行結果]
[4,5]
[nil,nil,nil,12,15]
[12,15]
このように、selectはただ3よりも大きな数を返しますが、mapはif文などで条件を絞り込んだ後に各要素に変更を加えることができます。
また、ifを使った場合条件に一致しない箇所にはnilが入るので、compactメソッドでnilを除いた結果を返しています。
if文の基本的な使い方はこちらで紹介しているので理解が浅いと感じている方は一読することをお勧めします。
また、compactメソッドはnilと消し去るために使用するので、こちらのnilの記事でまとめてあります。
まとめ
ここでは、selectについて基本的な使い方から応用的な使い方まで紹介しました。
selectメソッドは、配列を操作するメソッドの中でも特に利用頻度の高いメソッドです。
条件を指定して簡単に配列やハッシュの要素を絞り込むことができるので、ぜひ使いこなしてみてください。
また、selectメソッドだけがすべてではなく状況に応じて、適切なメソッドを使用していくことが大切です。
もしselectについて忘れてしまったらこの記事を確認してくださいね!