• WebCampPro_インタビュー
    未経験から上京し、エンジニアとしてチームラボグループに転職!【WebCampPro卒業生インタビュー】
    2018.03.10
  • WebCampPro_インタビュー
    未経験31歳からエンジニア転職を実現【実際に聞いてみた】
    2017.04.01
  • WebCampPro_インタビュー
    自分で稼ぐ力をつけるため、新卒5年目の営業マンがエンジニアに転職!【WebCampPro転職者インタビュー】
    2018.02.02
  • WebCamp_インタビュー
    「1カ月頑張ればこの先が見えてくる」地元メディアを立ち上げたママさん
    2017.07.20
  • WebCampPro_インタビュー
    未経験でも寿司職人からWebデザイナーになった!ホスピタリティでスクールを支える宮脇トレーナー
    2017.05.26
  • WebCamp_インタビュー
    時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
    2018.01.26
  • WebCamp_インタビュー
    “未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
    2017.10.04
  • WebCamp_インタビュー
    【WebCamp受講生インタビュー】起業準備中にCEOが気がついたプログラミングスキルの重要性とは?
    2017.12.25
  • WebCamp_インタビュー
    「自信の持てるスキルを得たい!」内定辞退した女子大生がプログラミングを学習したワケ。
    2018.04.28
  • WebCamp_インタビュー
    【卒業生インタビュー】台湾で月間100万UUの訪日旅行メディアを手掛けるCEOが、プログラミングを学んで得たものとは?
    2018.01.15
  • WebCamp_インタビュー
    【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
    2018.01.15

◆当サイトで人気のプログラミング教室のおすすめランキングはこちら!
プログラミングは独学では非効率で、時間を無駄にするリスクがあります。効率的なカリキュラムで学べるスクールを受講しましょう。

WEBCAMP【マンツーマンサポート】1ヶ月短期集中でプログラミングを学ぶスクール
1ヶ月通い放題・メンター常駐の教室環境でプログラミングを学びたい方!
TechAcademyオンラインで開講しているプログラミングスクール
オンラインでどこでも学べる!/教室に行くのが忙しい人でも安心!
Tech Camp教養としてのITスキルを学べるスクール
Webデザイン/AI(人工知能)/IOS/Androidアプリ制作/VRを学びたい方!
WEBCAMP PRO転職保証付き!エンジニアとして転職したい人におすすめ!
未経験からプロのエンジニアへ3ヶ月で転職する為のスクールです!
12月生募集中!当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
11月生は満員となっております。12月生募集に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

プログラムでデータを扱うとき、不正なデータや誤差の大きいデータなど、無意味なデータが含まれていることは少なくありません。そのため、与えられたデータの中から、必要なデータだけを抽出するという作業は、データ解析の正確性を計る上で避けられない処理です。

多くのプログラム言語では、すべてがはじめから作らなければいけないことがほとんどですが、Rubyではselectメソッドを使って比較的簡単に作ることができるようになっています。

もちろん、そんな大げさな話ではなく「偶数だけを取得したい」「特定の文字が含まれているデータだけ抽出したい」などの、ちょっとしたことも、selectメソッドを使えば簡単にできます。

そんなselectメソッドについて、詳しく解説していきましょう。

Rubyのselectとは

Rubyのselectメソッドは、Enumerableモジュールに定義されているメソッドです。つまり、EnumerableモジュールをMix-inしているArrayクラスやHashクラス、Rangeクラスなどのインスタンスで利用できるメソッドになります。

※Arrayクラスは、配列を実現しているクラスです。詳しくは、「【Ruby入門説明書】arrayについて解説」を参照ください
※Hashクラスは、ハッシュを実現しているクラスです。詳しくは、「【Ruby入門説明書】ハッシュについて解説」を参照してください
※Rangeクラスは、(1..10)のような範囲オブジェクトのひな形です。「【Ruby入門説明書】繰り返し、forについて解説」で紹介しています
※モジュールやMix-inについては、「【Ruby入門説明書】リファレンス、moduleについて解説」を参照してください

selectの構文

selectメソッドの構文は、以下のようになっています。

オブジェクト.select do |ブロック引数|
  条件
end

戻り値は、条件が成立する要素で構成された配列です。もし、条件が成立することがなければ、空の配列([])が返されます。

動かしてみよう

では、実際にselectメソッドを動かして、動作を確認してみましょう。

select00-1.rb

datas = [5, 8, 1, 4, 9, 3, 6, 2, 7]

# 偶数
even = datas.select do |a|
  print("#{a} ")  # ブロック引数が見えるように
  a % 2 == 0
end

puts
p(even)

(結果)

5 8 1 4 9 3 6 2 7
[8, 4, 6, 2]

上のプログラムは、条件の中に、ブロック引数を表示する処理を組み込んでいます。

つまり、ブロック引数aに、配列の要素が順番に格納されていることが見て取れます。そして、条件が成立した(この場合は2で割ったあまりが0、つまり偶数)要素のみで構成された配列が、戻り値として返ってきて変数evenへ格納されているわけです。

時間や場所にとらわれず自由に働くために必要なスキルとは?【WebCamp卒業生インタビュー】
2018-01-26 13:03
今回の記事では、WebCampに1ヶ月間通い、未経験からエンジニアとして転職した星野さんにお話を伺いました。 <プロフィール> 星野 智洋 さん(25) 学生時代は日本大学芸術学部...

selectの条件

selectの条件は、真偽を返すものであれば、どんなものでも問題ありません。

極端な話、「true」だけで同じ配列を返すだけでも、非常に長い処理を行って、真偽を返す処理でも、何の問題もありません。

そのため、条件を、andやorなどで組み合わせたり、正規表現での一致チェックなどを活用することで、プログラムに最適な要素を抽出することができるわけです。

具体的な例を、いくつか紹介しましょう。

3で割り切れるか、3を含む数を抽出する

datas = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50]

sekaino = datas.select do |a|
  a % 3 == 0 or a.to_s.include?("3")
end

p(sekaino)

「3で割り切れるかどうか」と、「文字列に変換して"3"を含んでいるかどうか」を確認する処理を、orで組み合わせています。動かして、結果を確認してみましょう。

クッキーだけを抽出

datas = ["Apple juice","Banana cookie","Lemon juice","Pine juice","Orange juice","Peach juice","Lemon cookie","Strowberry juice"]

cookies = datas.select do |a|
  a =~ /.*cookie/
end
p(cookies)

正規表現を使って、「cookie」で終わっている文字列だけを抽出しています。

こちらも、動かして結果を確認してみましょう。なお、Lemonだけはジュースとクッキーがあります。これだけ抽出できるでしょうか?

selectを利用するオブジェクト

配列でselectメソッドを使用した場合、抽出した要素の要素番号が欲しくなるときがあります。

そんなときには、selectメソッドを利用するオブジェクト側を少し工夫します。

つまり、配列のほうが、要素番号と値のセットになるようにしてしまうわけです。具体的には、each_with_indexメソッドを使います。

最初に紹介したselect00-1.rbにeach_with_indexメソッドを組み込んでみましょう。

select00-2.rb

datas = [5, 8, 1, 4, 9, 3, 6, 2, 7]

# 偶数
even = datas.each_with_index.select do |a|  # 修正(1)
  print("#{a} ")                            # ブロック引数が見えるように
  a[0] % 2 == 0                             # 修正(2)
end

puts
p(even)

(結果)

[5, 0] [8, 1] [1, 2] [4, 3] [9, 4] [3, 5] [6, 6] [2, 7] [7, 8]
[[8, 1], [4, 3], [6, 6], [2, 7]]

修正(1)の行で、selectメソッドを呼ぶ前に、each_with_indexメソッドを利用するようにしています。これは、datasがeach_with_indexメソッドを利用した結果の戻り値が、selectメソッドを利用しているという意味になります。

ブロック引数を表示した結果、ブロック引数には、each_with_indexメソッドの戻り値の要素、[値, 要素番号]の配列が格納されていることが見て取れます。

そのため、修正(2)にて、要素が偶数かどうかの確認を行う値を指定するように修正を行います。

結果は、each_with_indexメソッドの戻り値である[値, 要素番号]の配列を抽出したものになっていますので、値と要素番号を同時に取得することができるわけです。

もちろん、もっとシンプルに考えれば、selectメソッドの中で要素番号をカウントするという方法もあるでしょう。

しかし、以下の通り、要素番号を格納する配列も準備する必要がありますので、プログラムコードが煩雑になってしまうでしょう。(といっても、他のプログラム言語では当然のように行う処理です)

select00-3.rb

datas = [5, 8, 1, 4, 9, 3, 6, 2, 7]

idx = -1                    # 要素番号カウント用
idx_arr = []                # 抽出された要素番号を格納する

# 偶数
even = datas.select do |a|
  idx += 1                  # まず要素番号をカウント
  if a % 2 == 0
    idx_arr.push(idx)       # 抽出対象なので、要素番号を格納
    true                    # 真を返す
  else
    false                   # 偽を返す
  end
end

p(idx_arr)
p(even)

(結果)

[1, 3, 6, 7]
[8, 4, 6, 2]

select00-2.rbのほうがRubyらしいと言えますが、なにより、select00-3.rbよりも、select00-2.rbのほうがプログラムが見やすいというのは、大きな利点です。

“未経験”でもたった1ヶ月で営業からエンジニアとして転職!『WebCamp』受講者インタビュー
2017-10-04 10:26
今回の記事では、未経験からWebCampを1ヶ月受講し、その後エンジニアとして転職をした喜田さんにお話を伺いました。 <プロフィール> 喜田 大介 さん (28歳) 大学時代はプ...

Hashのselect

多くの参考書籍やサイトでselectメソッドを説明するとき、配列で説明して終わりの場合が少なくありません。

しかし、selectメソッドはハッシュでも利用できますので、使い方を説明します。

Hashクラスでselectメソッドを使うときに注意したいのは、「Hashの要素には、キーと値の2つのデータが格納されている」ということでしょう。

そのため、ハッシュでselectメソッドを使う場合は、以下のように構文が違ってきます。

ハッシュオブジェクト.select do |ブロック引数k, ブロック引数v|
  条件
end

ここで、ブロック引数kにはキーが、ブロック引数vには値が入ります。

なお、ブロック引数を1つしか設定しなかった場合は、ブロック引数kのみと解釈されますので、注意が必要です。(sortメソッドの場合は、ハッシュの要素がブロック引数1つに格納されました(「【Ruby入門説明書】リファレンス、sortについて解説」参照)が、selectメソッドではそうなりません)
具体的に確認してみましょう。

select01-1.rb

pv = {"Apple juice"=>300, "Lemon juice"=>200, "Strawberry juice"=>400, "Orange juice"=>500, "Lemon cookie"=>150, "Peach juice"=>400}

pv.select do |k, v|
  print("k, v = #{k}, #{v}\n")        # kとvに渡されているものを表示する
end

puts("-----------")
pv.select do |k|
  print("k = #{k}\n")                 # kに渡されているものを表示する
end

(結果)

k, v = Apple juice, 300
k, v = Lemon juice, 200
k, v = Strawberry juice, 400
k, v = Orange juice, 500
k, v = Lemon cookie, 150
k, v = Peach juice, 400
-----------
k = Apple juice
k = Lemon juice
k = Strawberry juice
k = Orange juice
k = Lemon cookie
k = Peach juice

結果の通り、ブロック引数を1つにした場合は、キーの値のみ格納されています。

そのため、ハッシュでselectを扱う場合は、キーと値のどちらを利用して抽出するのかを考えてプログラムコードを作らなければいけません。

例えば、select01-1.rbで400円以上のものを抽出しましょう。

select01-2.rb

pv = {"Apple juice"=>300, "Lemon juice"=>200, "Strawberry juice"=>400, "Orange cookie"=>500, "Lemon cookie"=>150, "Peach juice"=>400}

selected = pv.select do |k, v|
  v >= 400
end

puts(selected)

(結果)

{"Strawberry juice"=>400, "Orange cookie"=>500, "Peach juice"=>400}

コツコツ独学×スクールで実践。未経験からエンジニアに転職!【WebCamp卒業生インタビュー】
2018-03-22 23:28
今回の記事では、独学でPHPを1年半学習し、その後WebCampを受講して未経験からエンジニアへと転職された佐々木さんにお話を伺いました。 <プロフィール> 佐々木 祐樹 さん(2...

破壊的メソッドselect!

selectメソッドには、他のいくつかのメソッドと同じように、自分自身を並べ替えてしまう破壊的メソッドselect!も準備されています。

select!メソッドを使うことで、抽出した配列を受け取って保持する変数がいらなくなり、プログラムコードをシンプルにすることができる場合もありますので、適宜利用していきましょう。

select01-3.rb

pv = {"Apple juice"=>300, "Lemon juice"=>200, "Strawberry juice"=>400, "Orange cookie"=>500, "Lemon cookie"=>150, "Peach juice"=>400}

# 400円以上のジュースを抽出
pv.select! {|k, v| v >= 400}
pv.select! {|k, v| k.include?("juice")}

puts(pv)

(結果)

{"Strawberry juice"=>400, "Peach juice"=>400}

元々のデータを必要としないのであれば、select01-3.rbのようにすることで、複数条件の抽出でも、読みやすいプログラムコードで実現することができます。

問題「正しいデータに整形する」

次のような、文字列データがあります。空白が入っていると処理できませんので、空白のあるデータを抽出して修正し、すべてのデータで空白がない状態にしてください。

datas = ["abc "," def","g h i","jkl","  opq","rxt "]

まとめ

selectメソッドについて、説明しました。

Rubyで膨大なデータの中から必要なものを抽出するためには、ほぼ必ずselectメソッドを活用することになります。

また、selectメソッドで抽出してから行うことで、その後の処理で余計な例外処理を検討するシーンが少なくなり、処理をシンプルにすることもできるでしょう。

そういった「重要な脇役」としてselectメソッドを活用していければ、中級Rubyプログラマーへの道もひらけてくるに違いありません。

・selectメソッドは、Enumerableモジュールに定義されており、ArrayクラスやHashクラスにMix-inされている
・selectメソッドは、条件が成り立つ要素を抽出して返す
・Hashのselectメソッドを使うときには、キーと値のどの要素を使っているのかを意識すること
・Hashのselectメソッドのブロック引数には、Hashのキーと値を受け取る2つの引数が必要
・selectメソッドは、並べ替えられたオブジェクトを返す。select!は自分自身を並べ替えて返す

問題の答え

datas = ["abc "," def","g h i","jkl","  opq","rxt "]

datas.select! do |s|
  if s =~ /.*\s.*/
    s.gsub!(' ','')
  end
  true
end

print(datas)

WebCampOnline プログラミングコースについて

WebCampでは、「どこでも学べる」オンラインコースを開講しています。

初心者・未経験の方でもわずか1ヶ月でプログラミングの基礎を学び、アプリケーション開発をすることができます。

WebCampOnlineが選ばれる3つの理由

1.学習の仕方がわからなくても安心!初心者に寄り添った学習カリキュラム

これから学習を始める初心者の方や、独学で挫折してしまった方に向けて、アプリケーション作成をゴールとする一気通貫したカリキュラムを提供しています。2500名を輩出しているWebCampだからこその教室でのリアルな受講生の声を反映し、オンラインコースでも初心者に寄り添った学習体験をご提供いたします。

2.つまずいたらすぐ解決!プロのエンジニアに質問し放題

プログラミング学習で挫折する理由の多くは「つまずいた時に聞ける人がいない」ことです。オンラインコースでは、現役エンジニアやプロ講師に、すぐにチャットでの質問が可能です。つまずきをすぐに解消できるので、挫折せずに学習を継続することができます

3.1ヶ月間で終わらなくても大丈夫!カリキュラムは"卒業後"も"無料"で利用可能

受講したいけど、仕事が急に忙しくなるかもしれないから受講するか迷っている・・・そんな方も多いのではないでしょうか?ご安心ください。カリキュラムは期間終了後も「無料」で使うことができます。また、しっかり学習時間を確保した方も、振り返って学習することでプログラミングスキルがご自身に馴染んできます。

▼まずは無料でWebデザインのカリキュラムを体験しよう!

【インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!

ブラジルから帰国し技術をつけようとRubyエンジニアを目指してWebCampでRubyを学び、見事Webエンジニアとして転職を果たした田中さんにお話を伺いました。

Rubyの学習がしたい。基礎をしっかりと理解したい

転職のサポートがほしい

と考えている方はぜひお読み下さい。

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby入門説明書】rescueについて解説
  • 【Ruby入門説明書】jsonについて解説
  • 【Ruby入門説明書】csvについて解説
  • 【Ruby入門説明書】mapについて解説
  • 【Ruby入門説明書】gemsについて解説
  • 【Ruby入門説明書】ruby sliceについて解説
おすすめの記事