LoginSignup
29
29

More than 3 years have passed since last update.

配列の基礎的なメソッド集【Ruby超入門】

Last updated at Posted at 2019-04-27

配列

配列は複数のデータをまとめて格納できるオブジェクト。
配列内の要素は順番に並んでいて、添え字(インデックス)を指定することでそのデータを取り出すことができる。

  • 配列は[]の中にカンマ区切りで複数のオブジェクトを書いていく。
  • 中身が無い場合は空の配列ができる。
  • 種類の違うオブジェクトも入れられる。
  • 変数に代入する場合は複数形で命名する。

関連記事
命名規則【Ruby超入門】

配列の要素を取得

配列は変数の後に[n]などのインデックス番号をつけることで取得できます。
この[n]の中のインデックス番号は配列の先頭からを示しているのですが、注意としては0番目から始まるということです。
1番目の'コーヒー'[0]で、3番目の'ティーラテ'[2]となります。

drinks = ['コーヒー', 'カフェラテ', 'ティーラテ']
puts drinks[0]  #=> 'コーヒー'
puts drinks[2]  #=> 'ティーラテ'

[n]の番号に-(マイナス)をつけることで後ろの要素から取得できます。

drinks = ['コーヒー', 'カフェラテ', 'ティーラテ']
puts drinks[-1]  #=> 'ティーラテ'
puts drinks[-2]  #=> 'カフェラテ'

要素以上の番号で指定した場合はnilが帰ってきます。nilは「何もない」ことを表すオブジェクトです。

drinks = ['コーヒー', 'カフェラテ', 'ティーラテ']
puts drinks[3]  #=> nil

基本的なメソッド

first、last

firstメソッドは[0]と同じで、配列の先頭の要素を取得するメソッドです。
lastメソッドは[-1]と同じで、配列の末尾の要素を取得するメソッドです。

drinks = ['コーヒー', 'カフェラテ', 'ティーラテ']
puts drinks.first  #=> 'コーヒー'
puts drinks.last  #=> 'ティーラテ'

push、unshift

pushメソッドは配列の末尾へ要素を追加するメソッドです。
<<でも末尾へ要素を追加できます。
unshiftメソッドは配列の先頭に要素を追加するメソッドです。

drinks = ['コーヒー']
drinks.push('カフェラテ')
p drinks
#=> ['コーヒー', 'カフェラテ' ]
drinks.unshift('モカ')
p drinks
#=> ['モカ', 'コーヒー', 'カフェラテ']
drinks << 'ティーラテ'
p drinks
#=> ['モカ', 'コーヒー', 'カフェラテ', 'ティーラテ']

pop、shift

popメソッドは配列の末尾から要素を1つ削除するメソッドです。
shiftメソッドは配列の先頭から要素を1つ削除するメソッドです。

drinks = ['モカ', 'コーヒー', 'カフェラテ']
drinks.pop
p drinks  #=> ['モカ', 'コーヒー']
drinks.shift
p drinks  #=> ['コーヒー']

なおpopメソッドとshiftメソッドは、削除した要素を返します。

drinks = ['モカ', 'コーヒー', 'カフェラテ']
p drinks.pop  #=> 'カフェラテ'
p drinks.shift  #=>  'モカ'

配列の足し算と引き算

足し算

配列で足し算をすると、2つの配列をつなげて新しい配列を作ります。

a = [1, 2, 3]
b = [4, 5]
p a + b  #=> [1, 2, 3, 4, 5]

drinks_a = ['モカ', 'コーヒー']
drinks_b = ['カフェラテ', 'ティーラテ']
p drinks_a + drinks_b
#=> ['モカ', 'コーヒー', 'カフェラテ', 'ティーラテ']

引き算

配列で引き算をすると、元の配列から要素を取り除いた新しい配列を作ります。
引き算は配列aと配列bを比べて、配列aにだけある要素を得ることができます。

a = [1, 2, 3]
b = [1, 3, 5]
p a - b  #=> [2]

drinks_a = ['モカ', 'コーヒー', 'カフェラテ', 'ティーラテ']
drinks_b = ['モカ', 'ティーラテ']
p drinks_a - drinks_b  #=> ['コーヒー', 'カフェラテ']

便利なメソッド

  • sizeメソッド
  • sumメソッド
  • uniqメソッド
  • sampleメソッド
  • shuffleメソッド
  • sortメソッド
  • joinメソッド
  • splitメソッド

配列の要素数を得る(sizeメソッド)

sizeメソッドは配列の要素数を返す。

puts [1, 2, 3].size  #=> 3

配列の全要素の合計を得る(sumメソッド)

sumメソッドは配列の全要素を足した値を返す。

puts [1, 2, 3].sum  #=> 6

先ほどのsumメソッドと組み合わせると平均値の計算ができる。

a = [1, 2, 3]
puts a.sum / a.size  #=> 2

配列の重複している要素を取り除く(uniqメソッド)

uniqメソッドは重複している要素を取り除いた配列を返す。

p [1, 3, 2, 2, 3].uniq  #=> [1, 3, 2]

配列の要素をランダムに取得する(sampleメソッド)

sampleメソッドは配列の要素を1個ランダムに選んで返す。

puts [1, 2, 3].sample  #=> 2

引数を指定した場合は要素数を超えない範囲で取得する。

p [1, 2, 3, 4].sample(2)  #=> [1, 3]

配列の要素をランダムに並び替える(shuffleメソッド)

shuffleメソッドは配列の要素をランダムに並び替える。

p [1, 2, 3].shuffle  #=> [3, 1, 2]

配列の要素を順番に並び替える(sortメソッド)

sortメソッドは配列の要素を順番に並び替える。

p [3, 1, 2].sort  #=> [1, 2, 3]

配列の要素が数値の時は小さい順に並び替えて、文字列の時はabc順に並び替えられる。

また文字列は先頭の文字で比較し、同じであれば2文字目と比較していく。
大文字が混じると「大文字が先、小文字が後」となる。

p ['yuki', 'tama', 'aki'].sort
#=> ['aki', 'tama', 'yuki']
p ['yuki', 'aya', 'aki'].sort
#=> ['aki', 'aya', 'yuki']
p ['aya', 'aki', 'Tama'].sort
#=> ['Tama', 'aki', 'aya']

reverseメソッドを使うと並び順を逆にできる

p [3, 1, 2].sort.revers  #=> [3, 2, 1]

配列中の文字列を連結する(joinメソッド)

joinメソッドは配列中の文字列を連結する。
引数を指定すると、要素の間に指定した引数を入れて連結する。

puts ['カフェラテ', 'チーズケーキ', 'バニラアイス'].join
#=> カフェラテチーズケーキバニラアイス
puts ['カフェラテ', 'チーズケーキ', 'バニラアイス'].join('と')
#=> カフェラテとチーズケーキとバニラアイス

配列中の文字列を分割する(splitメソッド)

splitメソッドはスペース区切りになっている文字列を配列にして返す。
引数を指定すると、スペース以外の文字にも対応できる。

puts 'カフェラテ チーズケーキ バニラアイス'.split
#=> ['カフェラテ', 'チーズケーキ', 'バニラアイス']
puts 'カフェラテとチーズケーキとバニラアイス'.split('と')
#=> ['カフェラテ', 'チーズケーキ', 'バニラアイス']

ブロックを使う配列のメソッド

例として使用頻度の高いメソッドを挙げていく

  • eachメソッド
  • mapメソッド
  • selectメソッド/rejectメソッド
  • findメソッド

配列の繰り返し処理(eachメソッド)

doからendまでを「ブロック」と呼び、その中で配列を順番に繰り返す。
eachメソッドの役割は配列の要素を最初から最後まで順番に取り出すことだが、取り出した要素をどう扱うかは、ブロック内の処理に記述する。

numbers = [1, 2, 3]
numbers.each do |n|
  puts n
end

#=> 1
#=> 2
#=> 3

またブロックは以下のように1行で書くこともできる。

numbers = [1, 2, 3]
numbers.each { |n| puts n }

#=> 1
#=> 2
#=> 3

配列の各要素を変換(mapメソッド)

mapメソッドは配列の各要素へ処理を行い、結果を新しい配列にして返す。

例とて配列の各要素を10倍にした新しい配列を作る。

numbers = [1, 2, 3, 4, 5]
new_numbers = []
numbers.map { |n| new_numbers << n * 10 }

p new_numbers  #=> [10, 20, 30, 40, 50]

mapメソッドを使うとブロックの戻り値が配列の要素となる新しい配列が作成されるため、mapメソッドの戻り値をそのまま新しい変数に入れることができる。

numbers = [1, 2, 3, 4, 5]
# ブロックの戻り値が新しい配列の各要素になる
new_numbers = numbers.map { |n| n * 10 }

p new_numbers  #=> [10, 20, 30, 40, 50] 

配列の各要素を真偽値によって変換(selectメソッド/rejectメソッド)

selectメソッドはブロックの戻り値が真(true)の要素を返し、新しい配列を作る。

numbers = [1, 2, 3, 4, 5, 6]
# ブロックの戻り値が真になった要素だけが集められる
even_numbers = numbers.select { |n| n.even? }

p even_numbers  #=> [2, 4, 6]

rejectメソッドはselectメソッドの反対で、ブロックの戻り値が偽(false)の要素を返し、新しい配列を作る。

numbers = [1, 2, 3, 4, 5, 6]
# 3の倍数を除外する(3の倍数以外を集める)
non_multiples_of_three = numbers.reject { |n| n % 3 === 0 }

p non_multiples_of_three  #=> [1, 2, 4, 5]

配列の最初の要素を真偽値によって変換(findメソッド)

findメソッドはブロックの戻り値が真(true)になった最初の要素を返す。

numbers = [1, 2, 3, 4, 5, 6]
# ブロックの戻り値が最初に真になった要素を返す
even_numbers = numbers.find { |n| n.even? }

p even_numbers  #=> 2

ブロックを簡潔に書く(&:)

mapメソッドやselectメソッドなどにブロックを渡す代わりに、&:メソッド名といった引数を渡せば、ブロックを簡潔に書くことができる。

ただし以下の条件が揃った時のみ。

1. ブロック引数が1個だけである。
2. ブロックの中で呼び出すメソッドには引数がない。
3. ブロックの中では、ブロック引数に対してメソッドを1回呼び出す以外の処理がない。

# このコードは、
['ruby', 'java', 'perl'].map { |s| s.upcase }
#=> ['RUBY', 'JAVA', 'PERL']

# こう書き換えられる
['ruby', 'java', 'perl'].map(&:upcase)
#=> ['RUBY', 'JAVA', 'PERL']


# このコードは、
[1, 2, 3, 4, 5, 6].select { |n| n.odd? }
#=> [1, 3, 5]

# こう書き換えられる
[1, 2, 3, 4, 5, 6].select(&:odd?)
#=> [1, 3, 5]

参考書

29
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
29