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

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

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

Rubyで配列を扱うArrayオブジェクトは、ただ配列を扱えるというだけでなく、様々なメソッドを持ったとても強力なオブジェクトです。

Arrayを使えば、他のプログラム言語であれば自分で作らなければならない処理をメソッド1つで実現できるのです。

今回は、そんなArrayオブジェクトの便利なメソッドをやりたいことから調べる逆引き的に紹介しましょう。

 

Rubyのメソッドについて

Arrayオブジェクトのメソッドを紹介する前に、Array以外のオブジェクトも含むRuby全体のメソッドの動きと命名規則について、簡単に説明しておきます。

Rubyには標準の環境でも数多くのメソッドが準備されていますが、大きく分けると以下の3種類に分類できます。

・オブジェクトは変更せず、結果を戻り値として返す
・オブジェクト自身も変更して、結果を戻り値として返す
・結果がtrue(真)かfalse(偽)で返ってくる

前者は一般的なメソッドと言えるもので、処理の結果を受けとる変数(レシーバ)が別途必要です。

2つめは、オブジェクト自身を変更してしまうもので、レシーバがオブジェクト自体と言えるものです。この場合、戻り値としてレシーバを返す場合もあれば、別の値を返す場合もあります。

この2つめのメソッドを、破壊的メソッドと呼び、メソッド名の末尾に「!」を付けるのが慣例になっています。(ないものもあります)

最後の真偽を返すメソッドは、「等しい」、「含まれている」などの判断をするメソッドがほとんどです。

不等号などの演算子と同じようにifの条件に使うことを想定されており、メソッド名の末尾に「?」を付けるのが慣例になっています。(ないものもあります)

これらを踏まえて、この先をお読みください。

配列の要素検索(find,include?,select)

配列内を検索して、必要なデータの有無を確認したり、必要なデータだけ取り出したりというのは、処理の安定性や効率を考えると必須と言えます。

配列の検索を行うメソッドには、以下のようなものがあります。

メソッド 機能
find
detect
配列を検索し、条件に一致した要素を返す
include? 配列の中に一致する要素があるかどうかを返す
find_all
select
配列を検索し、一致した要素の配列を返す

それぞれ、簡単に解説し、サンプルプログラムを紹介します。

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

条件に一致した要素を返してくれるfind

findは配列の要素の中を1つずつ確認して、条件に一致すると処理を中断して一致した要素を返します。一致しなければ、nilを返します。なお、detectはfindメソッドの別名ですのでまったく同じです。

構文は以下のようになります。

オブジェクト.find do |変数|
条件
end

繰り返し分そのままの構文になっていますので、理解しやすいと思います。例えば、以下のような使い方が考えられます。

array01-1.rb

fruits = ["strawberry", "apple", "orange", "banana", "peach", "melon"]

under7 = fruits.find do |fr|
fr.length < 7
end

print(under7)

(結果)

apple

7文字未満の文字列を探しているプログラムです。

条件に合う文字列は、appleだけではなく、orangeやbananaもありますが、findは見つけると処理を終えるため、最初に見つかる(先頭に近い)appleだけ返されているわけです。

なお、findメソッドには引数を渡すこともでき、callメソッドを持っているオブジェクトを渡すことができます。その場合、見つからなかったときにcallメソッドが呼ばれます。callメソッドを持っているオブジェクトについては、中級以上のRubyプログラマーの領域ですので、説明は割愛しますが、任意の処理を行うことができると考えてかまいません。例えば、見つからなければ、「not found!」と表示するプログラムは、以下のようになります。

fruits = ["strawberry", "apple", "orange", "banana", "peach", "melon"]

under1 = fruits.find(proc { print("not found!") }) do |fr|
fr.length < 1
end

print(under1)

※procはcallメソッドを持つ代表的なオブジェクトです。

あるかどうかだけ確認するinclude?

要素の内容ではなく、配列内に条件に合う要素があるかどうかだけを確認するには、include?が便利です。

構文は以下のようにシンプルで、array01-2.rbのように、分岐処理と組み合わせて使うことが多いでしょう。

オブジェクト.include?(比較する値)

array01-1.rb

fruits = ["strawberry", "apple", "orange", "banana", "peach", "melon"]

if fruits.include?("berry") then
  print("founded berry!")
else
  print("not founded berry")
end

(結果)

not founded berry

結果のとおり、部分一致ではなく、完全一致で検索していますので、注意が必要です。

見つかった要素の配列を返すfind_all、select

findメソッドのように最初に見つかったものだけでなく、条件に一致した要素をすべて取得したければ、find_allメソッドが便利です。

find_allメソッドは、条件と一致する要素のみで構成された配列を返してくれます。
※selectはfind_allメソッドの別名です。

構文は、findメソッドと同じで、繰り返して検索していることが良く分かります。

オブジェクト.find_all do |変数|
条件
end

array01-3.rb

fruits = ["strawberry", "apple", "orange", "banana", "peach", "melon"]

under7s = fruits.find_all do |fr|
fr.length < 7
end

print(under7s)

(結果)

["apple", "orange", "banana", "peach", "melon"]

なお、条件に一致する要素がなかった場合や1つしかなかった場合でも、配列が返ってきますので、注意が必要です。

配列の数だけ処理を繰り返す(each,each_with_index)

配列の要素数だけ繰り返し処理を行うeachメソッドやeach_with_indexメソッドは、比較的頻繁に使うメソッドでしょう。

配列の数だけ繰り返して任意の処理を行うことができる代表的なメソッドは、次の2種類になります。

メソッド 機能
each 配列の要素を1つずつ参照しながら処理を繰り返す
each_with_index 配列の要素とインデックスを1つずつ参照しながら処理を繰り返す

詳細は「【Ruby入門説明書】繰り返し、eachについて解説」で説明していますので、ここでは構文だけ紹介しておきます。

eachメソッドの構文

オブジェクト.each do |変数|
  処理
end

each_with_indexメソッドの構文

オブジェクト.each_with_index do |要素用の変数, インデックス用の変数|
  処理
end

配列を連結する(+,concat)

複数の配列を1つにまとめるというのは、他のプログラム言語では手間がかかりますが、Rubyでは容易に実装可能です。

メソッドには、直感的に使える+メソッドと、明示的に末尾に連結するconcatメソッドがあります。

+メソッドの構文

レシーバ = オブジェクト + 連結したい配列

concatメソッドの構文

オブジェクト.concat(連結したい配列)

なお、concatメソッドは破壊的メソッドですので、オブジェクトの配列が変更されます。+メソッドは戻り値で連結された配列が変えるだけですので、レシーバとなる変数などが必要です。このあたりの動きの違いが、使い分けの大きなポイントになるでしょう。

array02.rb

alphabets = ["a","b","c","d","e"]
numbers = [1,2,3,4,5]

print("alphabets = ", alphabets, "\n")
print("numbers   = ", numbers, "\n")
puts
print(" +        = ", alphabets + numbers, "\n")
print("alphabets = ", alphabets, "\n")
print("numbers   = ", numbers, "\n")
puts
print(" concat() = ", alphabets.concat(numbers), "\n")
print("alphabets = ", alphabets, "\n")
print("numbers   = ", numbers, "\n")

(結果)

alphabets = ["a", "b", "c", "d", "e"]
numbers   = [1, 2, 3, 4, 5]

 +        = ["a", "b", "c", "d", "e", 1, 2, 3, 4, 5]
alphabets = ["a", "b", "c", "d", "e"]
numbers   = [1, 2, 3, 4, 5]

 concat() = ["a", "b", "c", "d", "e", 1, 2, 3, 4, 5]
alphabets = ["a", "b", "c", "d", "e", 1, 2, 3, 4, 5]
numbers   = [1, 2, 3, 4, 5]

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

配列を並べ替える(sort,sort!)

配列には様々なデータが格納されます。そのデータを利用するにあたって、並べ替えたほうが都合が良い場合も少なくありません。

Rubyの配列(Arrayオブジェクト)であれば、sortメソッドを使って簡単に実装できます。

なお、破壊的メソッドであるsort!メソッドも準備されていますので、用途に合わせて使い分けましょう。

sortメソッドには、単純な大小比較による並べ替えか、任意の比較による並べ替えかによって、2つの使い方があります。

大小比較による並べ替えの場合

レシーバ = オブジェクト.sort

この場合は、メソッドによる並べ替えを行います。

メソッドは、左辺と右辺の値の大小を比較し、左辺のほうが大きければ-1、一致すれば0、右辺のほうが大きければ1を返すメソッドです。

sortメソッドは、このメソッドを使って、インデックスの小さいほうから順に昇順に並べ替えた配列を作ります。(sort!メソッドは自分自身を書き換えます)

文字列の場合は、文字コード順になりますので、アルファベット順だと考えて良いでしょう。

具体的に見てみましょう。

array03-1.rb

alphabets = ["b","d","g","f","a"]
numbers = [4,5,3,2,1]

print("alphabets = ", alphabets, "\n")
print("numbers   = ", numbers, "\n")
puts
print(" sort     = ", alphabets.sort, "\n")
print(" sort!    = ", numbers.sort!, "\n")
puts
print("alphabets = ", alphabets, "\n")
print("numbers   = ", numbers, "\n")

(結果)

alphabets = ["b", "d", "g", "f", "a"]
numbers   = [4, 5, 3, 2, 1]

 sort     = ["a", "b", "d", "f", "g"]
 sort!    = [1, 2, 3, 4, 5]

alphabets = ["b", "d", "g", "f", "a"]
numbers   = [1, 2, 3, 4, 5]

なお、大小比較できないような要素があった場合はエラーになりますので、注意が必要です。

任意の比較による並べ替えの場合

大小比較による並べ替えでは、昇順の並べ替えしかできませんし、大小比較できないものは並べ替えられません。そのため、降順など都合の良い並べ替えをしたい場合は、こちらの方法を使うことになるでしょう。

この場合の構文は、以下のようになります。

オブジェクト.sort do |要素1, 要素2|
比較処理
end

要素1と要素2は、比較する2つの要素を表しており、最初はインデックス0の要素とインデックス1の要素が入ります。

比較処理の結果が、-1もしくは0の場合は要素1→要素2の順番、結果が1であれば要素2→要素1の順番に並べ替えられます。そのため、それを見越して処理を作ることになります。

例えば、array03-1.rbのalphabetsを降順にするプログラムを作ってみましょう。

array03-2.rb

alphabets = ["b","d","g","f","a"]

print("alphabets = ", alphabets, "\n")
puts

result = alphabets.sort do |a1, a2|
a2 <=> a1
end
print("alphabets = ", result, "\n")

(結果)

alphabets = ["b", "d", "g", "f", "a"]

alphabets = ["g", "f", "d", "b", "a"]

ブロックの中に比較だけが入っているので、他のプログラム言語を経験している人は、少し気持ち悪いかもしれませんね。

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

すべての要素に同じ操作を(map,map!)

解析処理などでは、文字列をすべて大文字にして扱う文字種を減らしたり、桁数を上げて計算誤差を減らしたりするなどで、データを整えることが多いです。

そんな、配列のすべての要素に対して同じ処理をするのも、mapメソッドを使えば難しくありません。

【Ruby入門説明書】繰り返し、eachについて解説」で詳しい説明をしていますので、そちらを参照していただいても良いですが、構文だけ紹介しておきましょう。

オブジェクト.map do |変数|
  処理
end

なお、map!メソッドは破壊的メソッドですので、オブジェクトを書き換えます。元のデータが不要な場合などに使うことで、メモリの節約になりますので、用途によって使い分けましょう。

要素の削除(delete,delete_at,delete_if)

あまり行うことがないかもしれませんが、配列の要素を削除することもできます。

削除したい要素をどう設定するかによって、以下の3つのメソッドがあります。

メソッド 機能
delete 引数と一致する要素を削除します。戻り値は削除した要素です
delete_at 指定したインデックスの要素を削除します。戻り値は削除した要素です
delete_if 要素ごとに処理を行い、結果が真になる要素を削除します。戻り値はオブジェクト自身です

すべて破壊的メソッドですので、元データが必要であれば、作業用のコピーで処理しましょう。
また、削除することでインデックス番号は振り直されますので、削除した要素以降のインデックスはずれますので、意識しておきましょう。

それぞれのメソッドの構文とサンプルプログラムを掲載しておきます。

delete

構文

オブジェクト.delete(引数)

引数で渡した値と同じデータを持つ要素を削除します。一致した要素すべてを削除します。

戻り値として、削除したデータが返ってきます。もし、1つも一致しなければ、nilが返ってきます。

delete_at

構文

オブジェクト.delete_at(インデックス)

引数に指定したインデックスの要素だけ削除します。戻り値としては、削除した要素が返ってきます。

delete_if

構文

オブジェクト.delete_if do |変数|
削除条件
end

削除条件が成り立った要素を削除します。戻り値は、オブジェクト自身です。

サンプルプログラム

array04.rb

fruits = ["strawberry", "apple", "orange", "banana", "peach", "melon"]

print(fruits, "\n")
print('delete("orange") --> ', fruits.delete("orange"), "\n")
print(fruits, "\n")
puts
print('delete_at(0) ------> ', fruits.delete_at(0), "\n")
print(fruits, "\n")
puts
fruits.delete_if do |fr|
  fr.length > 5
end
print('delete_if ---------> ', fruits, "\n")

配列を使ったスタック構造(push,pop)

スタック構造というのは、データを「先入れ後出し(FILO)」するデータ構造のことで、最初に入れたデータは最後に取り出すという方法でデータを管理します。(本を積ん読(読まずに積んでおく)ようなもので、最初に置いた本はあとから置いた本を取ったあとでなければ取れません。(無理に横から抜くと崩れます))

スタックはプログラムの実行順の管理やメモリ管理に使われる構造で、コンピュータの世界ではとてもメジャーなものですので、聞いたことがある人もいるでしょう。

この「先入れ先出し」構造は、データを入れる「push」とデータを取り出す「pop」があれば実現することができるのですが、まさにRubyのpushメソッドとpopメソッドを活用することができるわけです。

pushメソッドとpopメソッドについては、「【Ruby入門説明書】配列について解説」で詳しく解説していますので、そちらを参照していただくとして、ここではプログラムでスタック構造の動きを確認してみましょう。

実用的なものとして、プログラム実行時に渡した文字列中の(と)が正しく対応しているかを確認するプログラムを作ってみます。

array05.rb

# 引数なしチェック
if ARGV.empty?
  print("needs ARGV!")
  return
end

# 解析する文字列を1文字ずつ配列に入れる
data = ARGV[0].split("")

stack = []  # スタック用配列

# "("はスタックに格納し、")"だと取り出す
msg = "OK"
data.each do |chr|
  if chr == "("
    stack.push(chr)
  elsif chr == ")"
    # スタックになにもないのに")"がくれば、")"が多い
    if (stack.pop).nil?
      msg = '"("が足りません'
      break
    end
  end
end

# スタックが空(empty)でなければ、"("が多い
if not stack.empty?
  msg = '")"が足りません'
end

print(msg)

例えば、次のような結果になります。

> ruby array05.rb (test)
OK

> ruby array05.rb tes(t
")"が足りません

> ruby array05.rb test))
"("が足りません

「(」があればスタックに格納(push)し、「)」があればスタックから取り出す(pop)ことを繰り返し、空なのにpopを行った場合は「(」不足、最終的にスタックが空でなければ「)」不足だと判断しています。

まとめ

Rubyの配列(Arrayオブジェクト)の詳細を説明しました。

ここまで紹介したように、Rubyの配列はほかのプログラム言語に比べて、とても高機能で様々な処理をシンプルに実装することができるようになっています。つまり、並べ替えや検索などの既存のアルゴリズムを改めてプログラムとして作る必要がないので、本来の「やりたいこと」をする部分に集中してプログラミングすることができるのです。

ぜひ、ここで紹介したメソッドを使って、様々な「やりたいこと」を実現してください。


・Rubyのメソッドには、普通のメソッド、破壊的メソッド、真偽値を返すメソッドがある
・配列の検索は、find,include?,select
・配列の繰り返しは、each,each_with_index
・配列の連結は、+,concat
・配列の並べ替えは、sort
・配列の置き換えは、map
・配列の削除は、delete,delete_at,delete_if
・配列でスタック構造を作るには、pushとpop

WebCamp・WebCamp Proについて

WebCampは1ヶ月でプログラミング・Webデザインスキルを学ぶ通い放題のプログラミングスクールです。WebCamp Proは3ヶ月間で未経験から即戦力エンジニアを育成するプログラミングスクールです。

2つのサービスを運営するインフラトップでは、「学びと仕事を通して人生を最高の物語にする」という理念で会社を経営しています。

キャリアアップを目指す方は、この機会に私達と一緒にプログラミングを学んでみませんか?

8月枠も残りわずか当社人気の転職保証コース
プログラミング学習から転職成功まで導く、当社人気のWebCamp Proコース。
7月受入枠は満員となっております。8月枠に向け、お早めの申込みをオススメします。
プログラミング未経験でもエンジニア転職を絶対成功させたい
スキルを身に着けて人生を自ら切り開きたい
上記にあてはまる方は、ぜひご検討ください!

▼未経験から1ヶ月でWebデザイン・プログラミングを学びたい方はこちら!

▼ついに開講!オンラインでWebデザインを学びたい方はこちら!

 

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

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

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

転職のサポートがほしい

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

【WebCamp卒業生インタビュー】1ヶ月でRubyをゼロから学び、Webエンジニアとして転職!
2018-01-15 13:23
今回の記事では、WebCampで1ヶ月間Rubyを学習し、Webエンジニアとして転職した卒業生の田中さんにお話を伺いました。 <プロフィール> 田中 デニス 昭彦さん(...
関連キーワード
Rubyの関連記事
  • 【Ruby入門説明書】クラスの継承について解説
  • 【Ruby入門説明書】インスタンスと変数について説明
  • 【Ruby入門説明書】メソッドの基本から応用までの全体像、一覧表について解説
  • 【Ruby入門説明書】クラスの定義について解説
  • 【Ruby入門説明書】ハッシュについて解説
  • 【Ruby入門説明書】arrayについて解説

当サイトで人気のオススメ転職サービスTOP3

1位 マイナビエージェント×IT

おすすめポイント

・平日忙しい人も、土曜日開催の個別キャリア相談会に参加できる

・職種や仕事内容(要件定義、上流工程から携わる仕事など)の要望が細かくできる
・マイナビの規模を活かした豊富で幅広い求人数

マイナビエージェント×ITの登録はこちら

2位 レバテックキャリア

おすすめポイント

・求人登録数4,000件以上

・エンジニア未経験、経験者両方に対応

・有名企業の採用担当者インタビューがみれる

・一次面接NGからの内定実績もあるほど、内定率が高い

レバテックキャリアの登録はこちら

 3位 type転職エージェント

おすすめポイント

転職者の71%が年収アップ

・IT系企業、特にエンジニアに限らず営業職の求人も充実している

各職種専門の転職アドバイザーが援助

type転職エージェントの登録はこちら

おすすめの記事