こんにちは!ゆきまさです!!(@yyykms)
今回はRubyの配列によく使うようなメソッドをまとめてみたので参考にしてみてください。
また、他に便利なメソッドなどがあれば是非コメントしてください!!
配列とは?
["Ruby", "PHP", "Java"]
配列は複数のデータをまとめて格納できるオブジェクトです。
配列内の要素は順番に並んでいて、添え字(インデックス)を指定することでそのデータを取り出すことができます。
- 配列は [] の中にカンマ区切りで複数のオブジェクトを書いていく
- 中身が無い場合は空の配列ができる
- 種類の違うオブジェクトも入れられる
- 変数に代入する場合は複数形で命名する
Rubyには「ハッシュ」というものがあります。こちらも配列のように複数の情報を格納するオブジェクトです。
配列の要素を取得
配列は変数の後に [n] などのインデックス番号をつけることで取得できます。
この [n] の中のインデックス番号は配列の先頭からを示しているのですが、注意としては0番目から始まるということです。
1番目の「Ruby」は [0] で、3番目の「Java」は [2] となります。
languages = ["Ruby", "PHP", "Java"]
puts languages[0] #=> Ruby
puts languages[2] #=> Java
[n] の番号に -(マイナス)をつけることで後ろの要素から取得することができます。
languages = ["Ruby", "PHP", "Java"]
puts languages[-1] #=> Java
puts languages[-2] #=> PHP
要素以上の番号で指定した場合はnilが返ってきます。
nilは「何もない」ことを表すオブジェクトです。
languages = ["Ruby", "PHP", "Java"]
puts languages[3] #=> nil
要素を取得、追加、削除するメソッド
first、last
firstメソッドは [0] と同じで、配列の先頭の要素を取得するメソッドです。
lastメソッドは [-1] と同じで、配列の末尾の要素を取得するメソッドです。
languages = ["Ruby", "PHP", "Java"]
puts languages.first #=> Ruby
puts languages.last #=> Java
push、unshift
pushメソッドは配列の末尾へ要素を追加するメソッドです。
unshiftメソッドは配列の先頭に要素を追加するメソッドです。
languages = ["Ruby"]
languages.push("PHP")
#=> ["Ruby", "PHP"]
languages.unshift("Java")
#=> ["Java", "Ruby", "PHP"]
pushの代わりに「 << 」でも末尾へ要素を追加することができます。
languages = ["Ruby"]
languages << "PHP"
#=> ["Ruby", "PHP"]
pop、shift
popメソッドは配列の末尾から要素を1つ削除するメソッドです。
shiftメソッドは配列の先頭から要素を1つ削除するメソッドです。
languages = ["Java", "Ruby", "PHP"]
languages.pop
#=> "PHP"
p languages
#=> ["Java", "Ruby"]
languages.shift
#=> "Java"
p languages
#=> ["Ruby"]
配列の足し算と引き算
足し算
配列で足し算をすると、2つの配列をつなげて新しい配列を作ります。
a = [1, 2, 3]
b = [4, 5]
p a + b
#=> [1, 2, 3, 4, 5]
languages_a = ["Ruby", "PHP"]
languages_b = ["Java", "JavaScript"]
p languages_a + languages_b
#=> ["Ruby", "PHP", "Java", "JavaScript"]
引き算
配列で引き算をすると、元の配列から要素を取り除いた新しい配列を作ります。
引き算は配列aと配列bを比べて、配列aにだけある要素を得ることができます。
a = [1, 2, 3]
b = [1, 3, 5]
p a - b
#=> [2]
languages_a = ["Ruby", "PHP", "Java", "JavaScript"]
languages_b = ["Java", "JavaScript"]
p languages_a - languages_b
#=> ["Ruby", "PHP"]
その他の便利なメソッド
- sizeメソッド
- sumメソッド
- uniqメソッド
- sampleメソッド
- shuffleメソッド
- sortメソッド
- joinメソッド
- splitメソッド
配列の要素数を得る(sizeメソッド)
sizeメソッドは配列の要素数を返します。
puts [1, 2, 3].size #=> 3
sizeメソッドのエイリアスであるlengthメソッドを使用しても、同じように配列の要素数を得ることができます。
puts [1, 2, 3].length #=> 3
配列の全要素の合計を得る(sumメソッド)
sumメソッドは配列の全要素を足した値を返します。
puts [1, 2, 3].sum #=> 6
先ほどのsizeメソッドと組み合わせると平均値の計算をすることも可能です。
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
puts [1, 2, 3].sample #=> 1
puts [1, 2, 3].sample #=> 1
puts [1, 2, 3].sample #=> 3
引数を指定した場合は要素数を超えない範囲で取得することもできます。
p [1, 2, 3, 4].sample(2) #=> [1, 3]
p [1, 2, 3, 4].sample(2) #=> [4, 1]
p [1, 2, 3, 4].sample(2) #=> [1, 2]
p [1, 2, 3, 4].sample(2) #=> [1, 4]
配列の要素をランダムに並び替える(shuffleメソッド)
shuffleメソッドは配列の要素をランダムに並び替えます。
p [1, 2, 3].shuffle #=> [3, 1, 2]
p [1, 2, 3].shuffle #=> [2, 3, 1]
p [1, 2, 3].shuffle #=> [2, 1, 3]
配列の要素を順番に並び替える(sortメソッド)
sortメソッドは配列の要素を順番に並び替えます。
配列の要素が数値の時は小さい順に並び替えて、文字列の時はabc順に並び替えます。
p [3, 1, 2].sort #=> [1, 2, 3]
p [2, 3, 1].sort #=> [1, 2, 3]
p [2, 1, 3].sort #=> [1, 2, 3]
p ["aya", "jun", "ichiro"].sort #=> ["aya", "ichiro", "jun"]
p ["jun", "aya", "ichiro"].sort #=> ["aya", "ichiro", "jun"]
p ["ichiro", "aya", "jun"].sort #=> ["aya", "ichiro", "jun"]
また文字列は先頭の文字で比較し、同じであれば2文字目と比較していきます。
大文字が混じると「大文字が先、小文字が後」となります。
p ["Yuki", "aya", "Ichiro", "aki", "Ai"].sort
#=> ["Ai", "Ichiro", "Yuki", "aki", "aya"]
sortメソッドにreverseメソッドを使うと並び順を逆にすることができます。
p [3, 1, 2].sort.reverse
#=> [3, 2, 1]
p ["Yuki", "aya", "Ichiro", "aki", "Ai"].sort.reverse
#=> ["aya", "aki", "Yuki", "Ichiro", "Ai"]
配列中の文字列を連結する(joinメソッド)
joinメソッドは配列中の文字列を連結します。引数を指定すると、要素の間に指定した引数を入れて連結することができます。
puts ["Ruby", "PHP", "Java"].join
#=> RubyPHPJava
puts ["Ruby", "PHP", "Java"].join("と")
#=> RubyとPHPとJava
配列中の文字列を分割する(splitメソッド)
splitメソッドはスペース区切りになっている文字列を配列にして返します。引数を指定すると、スペース以外の文字にも対応できます。
p "Ruby PHP Java".split
#=> ["Ruby", "PHP", "Java"]
p "RubyとPHPとJava".split("と")
#=> ["Ruby", "PHP", "Java"]
ブロックを使う配列のメソッド
- eachメソッド
- mapメソッド
- selectメソッド/rejectメソッド
- findメソッド
配列の繰り返し処理(eachメソッド)
eachメソッドは配列の要素を1つずつ順番に取り出します。
取得した要素を変数に格納し、ブロック内で記述した処理を実行します。
numbers = [1, 2, 3]
numbers.each do |n|
puts n
end
#=> 1
#=> 2
#=> 3
配列 [1, 2, 3] の値を順番に 変数 n に代入して、ブロック内で出力処理をしています。
またブロックは以下のように1行で書くこともできます。
numbers = [1, 2, 3]
numbers.each { |n| puts n }
#=> 1
#=> 2
#=> 3
配列の各要素を変換(mapメソッド)
mapメソッドは配列の要素を繰り返し、ブロック内で実行した戻り値を配列にして返します。
戻り値が配列になるだけなので、変数の値自体は変わりません。
numbers = [1, 2, 3, 4, 5]
# 各要素を10倍にする
numbers.map { |n| n * 10 }
#=> [10, 20, 30, 40, 50]
p numbers #=> [1, 2, 3, 4, 5]
ブロックの戻り値が配列の要素となるため、mapメソッドの戻り値をそのまま新しい変数に入れることができます。
numbers = [1, 2, 3, 4, 5]
# ブロックの戻り値を変数に代入する
new_numbers = numbers.map { |n| n * 10 }
p numbers #=> [1, 2, 3, 4, 5]
p new_numbers #=> [10, 20, 30, 40, 50]
配列の各要素を真偽値によって変換(selectメソッド/rejectメソッド)
selectメソッドはブロックの戻り値が真(true)の要素を返し、新しい配列を作ります。
numbers = [1, 2, 3, 4, 5, 6]
# ブロックの戻り値がtrueになった要素だけが集められる
numbers.select { |n| n.even? }
#=> [2, 4, 6]
p numbers #=> [1, 2, 3, 4, 5, 6]
rejectメソッドはselectメソッドの反対で、ブロックの戻り値が偽(false)の要素を返し、新しい配列を作ります。
numbers = [1, 2, 3, 4, 5, 6]
# 3の倍数を除外する(3の倍数以外を集める)
numbers.reject { |n| n % 3 === 0 }
#=> [1, 2, 4, 5]
p numbers #=> [1, 2, 3, 4, 5, 6]
配列の最初の要素を真偽値によって変換(findメソッド)
findメソッドはブロックの戻り値が真(true)になった最初の要素を返します。
numbers = [1, 2, 3, 4, 5, 6]
# ブロックの戻り値が最初にtrueになった要素を返す
numbers.find { |n| n.even? }
#=> 2
ブロックを簡潔に書く(&:)
mapメソッドやselectメソッドなどにブロックを渡す代わりに、map(&:メソッド名) といった引数を渡せば、ブロックを簡潔に書くことができます。
ただし以下の条件が揃った時のみ可能です。
- ブロック引数が1個だけである。
- ブロックの中で呼び出すメソッドには引数がない。
- ブロックの中では、ブロック引数に対してメソッドを1回呼び出す以外の処理がない。
# このコードは、
["ruby", "php", "java"].map { |s| s.upcase }
#=> ["RUBY", "PHP", "JAVA"]
# こう書き換えられる
["ruby", "php", "java"].map(&:upcase)
#=> ["RUBY", "PHP", "JAVA"]
# このコードは、
[1, 2, 3, 4, 5, 6].select { |n| n.odd? }
#=> [1, 3, 5]
# こう書き換えられる
[1, 2, 3, 4, 5, 6].select(&:odd?)
#=> [1, 3, 5]
まとめ
意外とメソッドが多く大変かもしれませんが、mapなどはよく使うと思うので忘れそうになったらこの記事を参考にしてくれたら幸いです。